intval和(int)之间有什么特别的区别吗?
例:
$product_id = intval($_GET['pid']); $product_id = (int) $_GET['pid'];
上面两行代码之间有什么特别的区别吗?
intval()
可以通过转换的基数.(int)
不能.
int intval( mixed $var [, int $base = 10 ] )
有一点需要注意的区别(int)
和intval()
:intval()
把它们已经变量int
S和float
S作为需要任何转换,无论基本参数的(如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?
对不起,我只是想知道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
功能,因为施法是一种语言魔法正在发生.即使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
呢
我认为至少有一个区别:使用intval,你可以指定哪个base应该用作第二个参数(默认为10):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
会得到你:
int 123 int 123 int 83
Amber是正确的,如果我可以添加一个有用的信息类型转换(在表达式之前添加"(int)")比intval快300到600%.因此,如果您的目的不是处理小数以外的其他基数,我建议使用:
(int) $something
一个有用的属性intval
是 - 因为它是一个函数而不是语言构造 - 它可以作为参数传递给需要函数的函数.你不能这样做(int)
.
例如,我已经使用它来IN()
通过传递它来清理整数以包含在SQL 子句中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
应该与演员相同(除非你是挑剔的并且提到一个人进行函数调用而另一个没有).如手册页所述:
整数投射的通用规则适用.