มีความแตกต่างระหว่าง intval และ (int) หรือไม่?
ตัวอย่าง:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
มีความแตกต่างระหว่างรหัสสองบรรทัดด้านบนหรือไม่?
มีความแตกต่างระหว่าง intval และ (int) หรือไม่?
ตัวอย่าง:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
มีความแตกต่างระหว่างรหัสสองบรรทัดด้านบนหรือไม่?
คำตอบ:
intval()
สามารถส่งผ่านฐานที่จะแปลง (int)
ไม่ได้.
int intval( mixed $var [, int $base = 10 ] )
$i++
เป็นสีแดง แต่ควรช้าลง !!
$i++
ฉันไม่เคยพูดถึง คุณหมายถึงอะไร เมื่อคุณพูดว่า "แต่ควรช้าลง" คุณเปรียบเทียบอะไร
(int)
typecast เร็วกว่า x 2! (int)
: ideone.com/QggNGc , intval()
: ideone.com/6Y8mPN
สิ่งหนึ่งที่ควรทราบเกี่ยวกับความแตกต่างระหว่าง(int)
และintval()
: intval()
ถือว่าตัวแปรที่มีอยู่แล้วint
และfloat
ไม่ต้องการการแปลงโดยไม่คำนึงถึงอาร์กิวเมนต์ฐาน (อย่างน้อย 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?
The base parameter has no effect unless the var parameter is a string.
จากนั้นอีกครั้งหน้านี้มีการอัปเดตเมื่อสี่วันก่อนดังนั้นอาจเป็นสิ่งที่เพิ่มเข้ามา
intval(12,8)
จะให้คำตอบว่าเมื่อแปลงเป็นสตริงที่ไม่มีการจัดรูปแบบจะดูเหมือนฐาน 8 หมายเลขผิด สิ่งที่คุณคาดหวังจากintval(12,16)
เพราะมันไม่สามารถทำให้เป็น int c
?
ขออภัยที่ไม่ทราบว่าฉันต้องการทราบว่า 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
ต่อไป
+0
var ... ไม่แน่ใจว่าการส่งโดยนัยที่นี่นั้นเร็วกว่าการระบุชัดเจนหรือไม่
+0
ชนะ ... นั่นเป็นการแฮ็คที่สกปรกมาก
v5.5.34
ผลของฉันได้9191.0059452057 ms
, 23307.397127151 ms
และ11483.719110489 ms
ตามลำดับ ดังนั้นก่อน PHP 7 การคัดเลือกจะเร็วที่สุด
$a = '1' + 0;
และฉันก็พนันได้เลยว่าส่วนใหญ่ไม่เคยคิดที่จะทำแบบนั้นเลย
ฉันคิดว่ามีความแตกต่างอย่างน้อยหนึ่งรายการ: ด้วยintvalคุณสามารถระบุฐานที่ควรใช้เป็นพารามิเตอร์ที่สอง (ฐาน 10 เป็นค่าเริ่มต้น):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
คุณจะได้รับ:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
intval("g", 36) //16
ค่าใด ๆ มีขนาดใหญ่กว่า 36 ผลตอบแทน 0. นั่นแสดงให้เห็นว่าเราสามารถใช้ 0-9 บวกทุกตัวอักษร az intval("z",36) //35
ฐานของเราเองเช่น นอกจากนี้ก็ควรจะตั้งข้อสังเกตว่าพารามิเตอร์แรกเป็นกรณีตาย
คุณสมบัติที่มีประโยชน์อย่างหนึ่งของintval
มันคือ - เพราะมันเป็นฟังก์ชั่นและไม่ใช่โครงสร้างภาษา - มันสามารถส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชันที่คาดว่าจะมีฟังก์ชั่น (int)
คุณไม่สามารถทำเช่นนี้กับ
ตัวอย่างเช่นฉันได้ใช้มันเพื่อจำนวนเต็ม sanitize สำหรับการรวมเป็นของ SQL ข้อโดยการส่งผ่านไปยัง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'])
สีเหลืองอำพันถูกต้องและหากฉันอาจเพิ่มการคัดเลือกประเภทข้อมูลที่มีประโยชน์ (เพิ่ม "(int)" ก่อนนิพจน์ของคุณ) จะเร็วกว่า 300 ถึง 600% ดังนั้นหากวัตถุประสงค์ของคุณไม่ได้เกี่ยวข้องกับฐานอื่นที่ไม่ใช่ทศนิยมฉันแนะนำให้ใช้:
(int) $something
สิ่งที่intval
ทำแบบธรรมดาไม่ได้เป็นการแปลงพื้นฐาน:
int intval ( mixed $var [, int $base = 10 ] )
ถ้าฐานคือ 10 intval
ควรเป็นแบบเดียวกันกับนักแสดง (ยกเว้นว่าคุณจะเป็นคนทำไม้จิ้มฟันและพูดถึงว่าคนใดคนหนึ่งเรียกการเรียกฟังก์ชั่นในขณะที่คนอื่นไม่ได้) ตามที่ระบุไว้ในman page :
กฎทั่วไปของการคัดเลือกจำนวนเต็มใช้