intval和int之间是否有任何特别的区别 - “(int)X`?

时间:2009-12-16 05:56:59

标签: php

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

示例:

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

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

7 个答案:

答案 0 :(得分:176)

intval()可以passed a base进行转换。 (int)不能。

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

答案 1 :(得分:48)

有关(int)intval()之间区别的一件事:intval()将已经intfloat的变量视为不需要转换,无论基本参数如何(至少从PHP 5.3.5开始)。这种行为并不是最明显的,如comments on the PHP doc page中所述并且在这里无耻地重申:

$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?

答案 2 :(得分:23)

我认为至少存在一个区别:使用intval,您可以指定应将哪个基数用作第二个参数(默认情况下为10):

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

会得到你:

int 123
int 123
int 83

答案 3 :(得分:23)

对不起,我只是想知道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

答案 4 :(得分:14)

Amber是对的,如果我可以添加有用的信息 类型转换(在表达式之前添加“(int)”)比intval快300到600%。 因此,如果您的目的不是处理小数以外的其他基数,我建议使用:  (int) $something

答案 5 :(得分:12)

intval的一个有用属性是 - 因为它是一个函数而不是语言构造 - 它可以作为参数传递给需要函数的函数。您无法使用(int)执行此操作。

例如,我使用它来清理整数以包含在SQL IN()子句中,方法是将其传递给array_map。这是一个例子:

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

答案 6 :(得分:8)

intval做简单演员的事情不是基本转换:

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

如果基数是10,那么intval应该与演员相同(除非你是挑剔的并且提到一个人进行函数调用而另一个没有)。正如man page所述:

  

整数投射的通用规则适用。

相关问题