क्या इंटैल और कास्टिंग के बीच कोई विशेष अंतर है - `(इंट) एक्स`?


219

क्या अंतर और (इंट) के बीच कोई विशेष अंतर है?

उदाहरण:

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

क्या कोड की दो पंक्तियों के बीच कोई विशेष अंतर है?

जवाबों:


192

intval()एक आधार पारित किया जा सकता है जिसमें से परिवर्तित करना है। (int)नही सकता।

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

73
(int) intval से अधिक तेज़ है (), wiki.phpbb.com/Best_Practices:PHP के
मार्टिन

जैसा कि मैंने पहले आज नीचे उल्लेख किया है, आधार रूपांतरण अपेक्षित रूप से काम नहीं करता है यदि तर्क एक अंतर या फ्लोट है।
t-डब

1
@moose कि पेज राज्यों $i++है गलत लाल रंग में। लेकिन यह धीमा होना चाहिए !!
शिप्लू मोकादिम

1
मैंने कभी बात नहीं की $i++। आपका क्या अर्थ है? जब आप कहते हैं "लेकिन यह धीमा होना चाहिए !!" आप क्या तुलना करते हैं?
मार्टिन थोमा

6
मैंने ideone पर बेंचमार्किंग किया - (int)टाइपकास्ट तेजी से x 2 है! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
jave.web

52

के बीच के अंतर के बारे में ध्यान देने वाली एक बात (int)और intval(): intval()चर का व्यवहार करता है जो पहले से ही ints और floats हैं, बिना आधार तर्क की परवाह किए बिना रूपांतरण (PHP 5.3.5 के रूप में कम से कम)। यह व्यवहार सबसे स्पष्ट नहीं है, जैसा कि PHP डॉक्टर पृष्ठ पर टिप्पणियों में नोट किया गया है और बेशर्मी से यहाँ दोहराया गया है:

$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.फिर से चार दिन पहले पृष्ठ को स्पष्ट रूप से अपडेट किया गया था, इसलिए शायद यही जोड़ा गया।
ऑर्बिट में


6
मुख्य रूप से प्रलेखित या नहीं, व्यवहार इस तथ्य को देखते हुए थोड़ा आश्चर्यचकित होता है कि फ़ंक्शन सैद्धांतिक रूप से आधार रूपांतरण कर सकता है। इसने निश्चित रूप से मुझे पहले फंसा दिया, लेकिन शायद मुझे बस आरटीएफएम को थोड़ा और ध्यान से देखने की ज़रूरत है :)
t-dub

7
मुझे लगता है कि यह एक पुराना धागा है, और यदि आप अभी भी प्रोग्रामिंग कर रहे हैं, तो मुझे आशा है कि अब आप देखेंगे कि यह वास्तव में सबसे स्पष्ट परिणाम क्यों है। एक int का कोई आधार नहीं है क्योंकि आधार का उपयोग केवल स्ट्रिंग अभ्यावेदन में किया जाता है। या अधिक सरल रूप से, बेस 10 में 12 का एक इंट बेस 99 में 12 के इंट के समान है। यह अभी भी 12 है। उम्मीद है intval(12,8)कि जब कोई स्वरूपण के साथ एक स्ट्रिंग में परिवर्तित हो तो यह उत्तर देगा कि बेस 8 जैसा दिखेगा। संख्या सिर्फ गलत है। आप इससे क्या उम्मीद करेंगे intval(12,16)क्योंकि यह एक int नहीं बना सकता है c?
रॉबर्ट मैककी

1
या दूसरा तरीका ... 1 जनवरी, 1970 से अब तक 1523994328 टिक्स हो चुके हैं। यह पूछने पर कि क्या इसे MM / DD / YYYY या DD / MM / YYYY के रूप में संग्रहीत किया गया है, इससे कोई मतलब नहीं है क्योंकि यह उन दोनों प्रारूपों में संग्रहीत नहीं है। इसे किसी विशेष तिथि प्रारूप में नहीं, बल्कि एक संख्या के रूप में संग्रहीत किया जाता है। उसी तरह से पूछ रहा है कि एक इंट का आधार क्या है। उनके द्वारा प्रदर्शित प्रारूप से मूल्यों को अलग करना बहुत महत्वपूर्ण है।
रॉबर्ट मैककी

32

नेक्रोइंग के लिए क्षमा करें, मैं बस यह देखना चाहता था कि PHP7 का इस सवाल पर क्या प्रभाव पड़ता है:

$ 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यह कर्तव्य प्रदर्शन करने के लिए।

अद्यतन (PHP 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है var के लिए ... सुनिश्चित नहीं है कि यहाँ निहित कास्ट स्पष्ट से तेज़ है।
17

2
LOL @ +0जीतना ... यह एक बहुत ही गंदा हैक है
SparK

@ अपना विचार :) मैं इस पर विश्वास नहीं करूंगा, हालांकि, PHP के कास्टिंग नियम बिल्कुल ठीक नहीं हैं
पॉपुलस

के लिए v5.5.34मेरे परिणाम थे 9191.0059452057 ms, 23307.397127151 msऔर 11483.719110489 msक्रमशः। इसलिए PHP 7 से पहले, कास्टिंग सबसे तेज़ है।
यूनिकात्रिना

हालाँकि इसकी दूरगामी समझ मुझे पसंद है $a = '1' + 0;और मुझे यकीन है कि मैंने ऐसा करने के बारे में कभी नहीं सोचा था
mic

26

मुझे लगता है कि कम से कम एक अंतर है: इंटवल के साथ , आप निर्दिष्ट कर सकते हैं कि किस आधार को दूसरे पैरामीटर के रूप में इस्तेमाल किया जाना चाहिए (डिफ़ॉल्ट रूप से आधार 10):

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

आपको मिलेगा:

int 123
int 123
int 83

11
मुझे यह अविश्वसनीय रूप से मनोरंजक लग रहा है कि कोई व्यक्ति आधार संख्या 17 को "g" को दशमलव में बदल सकता है:intval("2g", 17) = 50 = 2*17 + 16
जेस्फीफर

1
@ जज पुरालेख मैं इसे और भी आगे ले गया, और पाया कि अधिकतम मैं आधार के रूप में पारित कर सकता हूं 36, जैसे कि intval("g", 36) //16। 36 रिटर्न से बड़ा कोई भी मूल्य 0. यह बताता है कि हम अपने कस्टम बेस के लिए सभी 0-9 प्लस az अक्षर का उपयोग कर सकते हैं, जैसे कि 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'])
डैनियल ओमाइन

@DanielOmine मेरा मतलब था कि आप कॉलबैक फ़ंक्शन को परिभाषित किए बिना इसका उपयोग कर सकते हैं।
कोदोस जॉनसन

15

एम्बर सही है और अगर मैं आपकी अभिव्यक्ति से पहले एक उपयोगी जानकारी टाइप कास्टिंग (एक "(int)" जोड़कर) जोड़ सकता हूं तो इंटवल की तुलना में 300 से 600% तेज है। इसलिए यदि आपका उद्देश्य दशमलव के अलावा अन्य आधारों से निपटने का नहीं है, तो मैं उपयोग करने की सलाह देता हूं: (int) $something


2
: कुछ आपको दिलचस्प लग सकते programmers.stackexchange.com/questions/99445/...
गेरी

8

वह चीज़ जो intvalएक साधारण कलाकार करता है वह आधार रूपांतरण नहीं है:

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

आधार 10 यद्यपि है, तो intvalएक कलाकारों के रूप में एक ही होना चाहिए (जब तक आप nitpicky और उल्लेख किया है कि एक एक समारोह कॉल, जबकि अन्य नहीं है बनाता जा रहे हैं)। जैसा कि मैन पेज पर दिया गया है :

पूर्णांक कास्टिंग के सामान्य नियम लागू होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.