intval和cast之间有什么特别的区别吗 – int(`)int?

intval和(int)有什么特别的区别吗?

例:

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

上面两行代码有什么特别的区别吗?

intval()可以传递一个从其转换的基础。 (int)不能。

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

有一点需要注意(int)intval()之间的区别: intval()将无论是否为基本参数(至less为PHP 5.3.5 intval()variables都视为int s和float s作为不需要转换。 这个行为并不是最明显的,正如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? 

我认为至less有一个区别:用intval ,你可以指定哪个基地应该被用作第二个参数(默认情况下是10):

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

会得到你:

 int 123 int 123 int 83 

对不起,我只是想看看/如何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%

但是我不得不把循环次数增加到1亿次,而这个差距只是几秒钟的事情,在大多数情况下,我真的会开始关心性能。

所以我会坚持使用intval函数,因为cast是一种语言魔法。 即使intval使用在幕后投射,如果在投射时发现了一个bug,并且由于某种原因它不能被修复(向后兼容?),那么他们至less可以修复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

琥珀色是正确的,如果我可以添加一个有用的信息types转换(在expression式之前添加“(int)”)比intval快300到600%。 所以如果你的目的不是处理其他基数而不是小数,我推荐使用: (int) $something

intval一个有用的属性是 – 因为它是一个函数而不是一个语言结构 – 它可以作为一个parameter passing给一个需要函数的函数。 (int)不能这样做。

例如,我用它来传递给array_maparray_map包含到SQL IN()子句中的array_map 。 这里是一个例子:

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

intval做一个简单的转换不是基础转换:

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

如果基数是10,那么intval应该与cast相同(除非你会挑剔,提到一个函数调用,而另一个不调用)。 正如手册页所述 :

整数铸造的通用规则适用。