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_map
来array_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相同(除非你会挑剔,提到一个函数调用,而另一个不调用)。 正如手册页所述 :
整数铸造的通用规则适用。