অন্তর্নির্মিতকরণ এবং int - `(int) X` এর মধ্যে ingালাইয়ের মধ্যে কোনও বিশেষ পার্থক্য রয়েছে?


219

ইনটুল এবং (ইনট) এর মধ্যে কোনও বিশেষ পার্থক্য রয়েছে কি?

উদাহরণ:

$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];

উপরের দুটি লাইনের কোডের মধ্যে কি বিশেষ পার্থক্য রয়েছে?

উত্তর:


192

intval()রূপান্তর করতে একটি বেস পাস করা যেতে পারে । (int)না পারেন.

int intval( mixed $var  [, int $base = 10  ] )

73
(ইনট্রি) ইনক্যুয়াল () এর চেয়ে দ্রুত ( উইকিপিএফপিবিবি.com
মার্টিন থোমা

যেমনটি আমি আজ আগে নীচে উল্লেখ করেছি , আর্গুমেন্টটি কোনও int বা ভাসমান হলে বেস রূপান্তরটি প্রত্যাশার মতো কাজ করে না।
t-dub

1
@moose যে পেজটি রাজ্যের $i++হয় ভুল লাল। তবে এটা ধীর হওয়া উচিত !!
শিপলু মোকাদ্দিম

1
আমি কখনও কথা বলিনি $i++। আপনি কি বোঝাতে চেয়েছেন? আপনি যখন বলেন "তবে এটি ধীর হওয়া উচিত !!" আপনি কি তুলনা করবেন?
মার্টিন থোমা

6
আমি আইডিয়োনে বেঞ্চমার্কিং করেছি - (int)টাইপকাস্ট দ্রুত এক্স 2! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
jave.web

52

মধ্যে পার্থক্য সম্পর্কে নোটটিতে একটা জিনিষ (int)এবং intval(): intval()একইরূপে ভেরিয়েবল যা ইতিমধ্যে ints এবং float(পিএইচপি 5.3.5 অন্তত হিসাবে) কোন রূপান্তর প্রয়োজন, বেস যুক্তি নির্বিশেষে যেমন s। এই আচরণটি সর্বাধিক সুস্পষ্ট নয়, যেমনটি পিএইচপি ডক পৃষ্ঠায় মন্তব্যগুলিতে উল্লিখিত হয়েছে এবং নির্লজ্জভাবে এখানে পুনরায় বলা হয়েছে:

$test_int    = 12;
$test_string = "12";
$test_float  = 12.8;

echo (int) $test_int;         // 12
echo (int) $test_string;      // 12
echo (int) $test_float;       // 12

echo intval($test_int, 8);    // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8)   // 12 <-- HUH?

13
ডক নেই বলে The base parameter has no effect unless the var parameter is a string.তারপর আবার পৃষ্ঠা দৃশ্যত আপডেট করা হয়েছে চার দিন আগে, তাই সম্ভবত যে কি যোগ করা হয়েছিল।
bit


6
তাত্ত্বিকভাবে ফাংশনটি বেস রূপান্তর করতে পারে এই সত্যতার ভিত্তিতে আচরণটি সামান্য অবাক করা Pr এটি অবশ্যই আমাকে আগে ছুঁড়েছে, তবে সম্ভবত আমাকে আরও কিছুটা সাবধানতার সাথে আরটিএফএম করা দরকার :)
টি-ডাব

7
আমি বুঝতে পারি এটি একটি পুরানো থ্রেড, এবং আপনি যদি এখনও প্রোগ্রামিং করে থাকেন তবে আমি আশা করি আপনি এখন দেখতে পাবেন কেন এটি আসলে সবচেয়ে সুস্পষ্ট ফলাফল। কোন int এর কোন বেস নেই কারণ বেসটি কেবল স্ট্রিং উপস্থাপনায় ব্যবহৃত হয়। বা আরো সহজভাবে, বেস 10 12 একজন int- এ বেস 99. 12 একজন int- এ এটা এখনও 12. হয় হিসাবে একই প্রত্যাশা যে intval(12,8)একটি উত্তর যে যখন কোন ফর্ম্যাটিং সহ একটি স্ট্রিং রূপান্তর একটি বেস 8 মত দেখাবে দিতে হবে সংখ্যা ঠিক ভুল। আপনি কী থেকে প্রত্যাশা করবেন intval(12,16)কারণ এটি কোনও int তৈরি করতে পারে না c?
রবার্ট ম্যাককি

1
বা অন্য কোনও উপায় ... ১ জানুয়ারি, ১৯ 1970০ সাল থেকে 1523994328 টিক আছে। এটি এমএম / ডিডি / ওয়াইওয়াই বা ডিডি / এমএম / ওয়াইওয়াই হিসাবে সঞ্চিত আছে কিনা তা জিজ্ঞাসা করা কোনও অর্থবোধ করে না কারণ এটি কোনও ফর্ম্যাটের কোনওটিতেই সংরক্ষণ করা হয়নি। এটি কোনও নির্দিষ্ট তারিখের বিন্যাসে নয়, একটি সংখ্যা হিসাবে সঞ্চিত। কোন int এর বেসটি জিজ্ঞাসা করার মতোই। সেগুলিতে প্রদর্শিত বিন্যাস থেকে মানগুলি পৃথক করা বেশ গুরুত্বপূর্ণ।
রবার্ট ম্যাককি

32

নেক্রোংয়ের জন্য দুঃখিত, আমি কেবল দেখতে চেয়েছিলাম পিএইচপি 7 এর এই প্রশ্নের কোনও প্রভাব আছে কিনা:

$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )

পরীক্ষা:

php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3279.1121006012 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "5379.3351650238 ms"

আপনি দেখতে পাচ্ছেন, কাস্টিং অবশ্যই প্রায় 100% দ্বারা দ্রুত হয়

তবে পার্থক্যটি কয়েক সেকেন্ডের আগে আমাকে লুপের সংখ্যাটি 100 মিলিয়নে বাড়িয়ে আনতে হয়েছিল, বেশিরভাগ ক্ষেত্রেই আমি কখন কার্য সম্পাদন সম্পর্কে যত্ন নেওয়া শুরু করব।

সুতরাং আমি intvalফাংশনটি ব্যবহার করে আঁকড়ে থাকব , কারণ .ালাই হ'ল ভাষা জাদু যা কিছুটা ঘটছে। এমনকি যদি intvalপর্দার পিছনে কাস্টিং ব্যবহার করা হয়, এমনকি যদি কাস্টিংয়ের সাথে কোনও বাগ পাওয়া যায় এবং কোনও কারণে এটি সংশোধন করা যায় না (পিছনের দিকে সামঞ্জস্যতা?) তবে তারা কমপক্ষে এটি নির্ধারণ intvalকরার জন্য ঠিক করতে পারে ।

আপডেট (পিএইচপি 7.1 + অতিরিক্ত কেস):

$ php -v
PHP 7.1.0RC6 (cli) (built: Nov  9 2016 04:45:59) ( NTS )
$ php -a
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3583.9052200317 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3569.0960884094 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = '1' + 0; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "1641.7920589447 ms"

7.1 অপ্টিমাইজড মনে হচ্ছে intvalএবং '1' + 0 এখন এই গতি প্রতিযোগিতার বিজয়ী :) আমি এখনও intvalযেভাবেই ব্যবহার চালিয়ে যাব


1
একমাত্র বেঞ্চমার্কটি কেবলমাত্র ভারের কাছে রয়েছে +0... নিশ্চিত নয় যে এখানে নিখুঁত castালাই সুস্পষ্টর চেয়ে দ্রুততর কিনা।
স্পার্ক

2
এলএল @ +0বিজয়ী ... এটি একটি খুব নোংরা হ্যাক
5:55

@ আপনার ধারণাটি স্পার্ক করুন :) যদিও আমি এটিতে বিশ্বাস করব না, পিএইচপি-র টাইপ কাস্টিং বিধিগুলি সর্বোত্তম নয়
পপুলাস

জন্য v5.5.34আমার ফলাফল ছিল 9191.0059452057 ms, 23307.397127151 msএবং 11483.719110489 msযথাক্রমে। সুতরাং পিএইচপি 7 এর আগে castালাই সবচেয়ে দ্রুত।
গ্রীক্যাট্রিনা

যদিও এটির চেয়ে কম বোধগম্য আমি পছন্দ করি $a = '1' + 0;এবং আমি বাজি ধরে দেখি যে এটির মতো করার কথা কখনও ভাবেননি
mic 6

26

আমার মনে হয় কমপক্ষে একটি পার্থক্য রয়েছে: অন্তর দিয়ে আপনি কোন বেসটি দ্বিতীয় প্যারামিটার হিসাবে ব্যবহার করতে হবে তা নির্দিষ্ট করতে পারবেন (বেস 10 ডিফল্ট হিসাবে):

var_dump((int)"0123", intval("0123"), intval("0123", 8));

আপনি পাবেন:

int 123
int 123
int 83

11
আমি এটি অবিশ্বাস্যভাবে মজাদার মনে করি যে কেউ বেস 17 নম্বর "জি" কে দশমিক হিসাবে রূপান্তর করতে পারে:intval("2g", 17) = 50 = 2*17 + 16
জেএসচেফার

1
@JSchaefer আমি এটা এমনকি আরও নিল এবং দেখা গেছে যে সর্বাধিক আমি বেস হিসাবে পাস পারে 36এমন হিসাবে, intval("g", 36) //16। ৩ 36 টিরও বেশি বড় কোনও মান ০. এটি প্রস্তাব দেয় যে আমরা আমাদের কাস্টম বেসের জন্য সমস্ত 0-9 প্লাস এজে অক্ষর ব্যবহার করতে পারি intval("z",36) //35। এছাড়াও, এটি লক্ষ করা উচিত যে প্রথম প্যারামিটারটি কেস-সংবেদনশীল
জে দধনিয়া

17

এর একটি দরকারী সম্পত্তি intvalহ'ল - যেহেতু এটি একটি ফাংশন এবং কোনও ভাষা নির্মাণ নয় - এটি কোনও ফাংশনকে প্রত্যাশা করে এমন কোনও ফাংশনের যুক্তি হিসাবে এটি পাস করা যেতে পারে। আপনি এটি দিয়ে এটি করতে পারবেন না (int)

উদাহরণস্বরূপ, আমি একটি এসকিউএল মধ্যে অন্তর্ভুক্ত করার জন্য নির্বিষ পূর্ণসংখ্যার তা ব্যবহার করেছেন IN()এটি ক্ষণস্থায়ী দ্বারা দফা array_map। এখানে একটি উদাহরণ:

$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";

কলব্যাক হিসাবে বেনামে ফাংশন:array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
ড্যানিয়েল ওমিন

@ ড্যানিয়েল ওমেন বলতে চাইছিলাম আপনি কলব্যাক ফাংশনটি সংজ্ঞায়িত না করেই এটি ব্যবহার করতে পারবেন।
কোডোস জনসন

15

অ্যাম্বারটি সঠিক এবং আমি যদি কোনও দরকারী তথ্য প্রকারের ingালাই যুক্ত করতে পারি (আপনার অভিব্যক্তির আগে "(int)" যুক্ত করা হয়) ইনটোলটির চেয়ে 300 থেকে 600% দ্রুত হয়। সুতরাং যদি আপনার উদ্দেশ্য দশমিকের চেয়ে অন্য ঘাঁটিগুলির সাথে লেনদেন না করা হয় তবে আমি সুপারিশ করছি: (int) $something


2
এমন কিছু যা আপনাকে আকর্ষণীয় মনে করতে পারে: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জার.কম
সেকশনস /

8

intvalসরল does ালাই যে জিনিসটি করে না তা হ'ল বেস রূপান্তর:

int intval ( mixed $var [, int $base = 10 ] )

যদি বেসটি 10 ​​হয় তবে intvalএটি একটি castালাইয়ের মতোই হওয়া উচিত (যদি না আপনি নিটপিকি হয়ে যাচ্ছেন এবং উল্লেখ না করেন যে একটি ফাংশন কল করে অন্যটি না করে)। ম্যান পেজে যেমন উল্লেখ করা হয়েছে :

পূর্ণসংখ্যা ingালাইয়ের সাধারণ নিয়ম প্রয়োগ হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.