说到字符串转整型,PHP 里常用的两个方法相信各位都有了解,但其中微小的区别缺鲜为人知。本文简单梳理,以备日后查阅。

功能

对于十进制的转换,两种方式的功能是完全一致的:

$int = intval($str);
// 等价于
$int = (int) $str;

intval() 具备一个可选参数 $base 默认值为 10,用于转换不同来自进制的数据:

$int = intval('0123', 8); // == 83

由这个参数,又引起另一条需要注意的点,先看例子:

$test_int    = 12;
$test_float  = 12.8;
$test_string = "12";

echo (int) $test_int;         // == 12
echo (int) $test_float;       // == 12
echo (int) $test_string;      // == 12

echo intval($test_int, 8);    // == 12
echo intval($test_float, 8)   // == 12
echo intval($test_string, 8); // == 10

intval() 会将类型已经是 intfloat 的数据当作「无需转换」而直接返回!

所以如上,$test_int$test_float 并没有按照八进制转换,使用时一定需要注意避免踩坑。

性能

(int)intval() 性能几乎无异。以下摘自本文评论(感谢 @CismonX):

If you call intval() with only one argument, it will be compiled to ZEND_CAST instruction by function zend_try_compile_special_func(), yielding identical opcode to that of (int). Thus, there’s no performance issue with intval() here.

The same is true for many other internal functions, like strval(), call_user_func(), etc., where function calls are optimized into opcode instructions at compile time. You can try that yourself using phpdbg.

参考

PHP 官方手册:

其它: