说到字符串转整型,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()
会将类型已经是 int
或 float
的数据当作「无需转换」而直接返回!
所以如上,$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 官方手册:
其它: