在intval和转换为int - ' (int) X '之间有什么特别的区别吗?

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

例子:

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

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

87506 次浏览

intval()可以是要转换的经过一个基地(int)不能。

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

intval做了简单强制转换没有做的事情是基本转换:

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

如果基数是10,intval应该与强制转换相同(除非你会吹毛求疵,提到一个函数调用而另一个没有)。如手册页中所述:

整数强制转换的通用规则适用。

我认为至少有一个区别:使用intval中,你可以指定应该使用哪个进制作为第二个参数(默认以10为进制):

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

会让你:

int 123
int 123
int 83
Amber是对的,如果我可以补充一个有用的信息 类型强制转换(在表达式前添加“(int)”)比intval快300%到600%。 所以如果你的目的不是处理十进制以外的其他进位,我建议使用: (int) $something < / p >

关于(int)intval()之间的区别需要注意的一点是:intval()将已经是__abc3和__abc4的变量视为不需要转换,不管基本参数是什么(至少从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的一个有用属性是——因为它是一个函数而不是语言构造——它可以作为参数传递给需要函数的函数。你不能用(int)这样做。

例如,我使用它通过将它传递给array_map来清除SQL IN()子句中包含的整数。这里有一个例子:

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