刨根问底儿 -- intVal($str) 跟 (int) $str 的运算结果有什么区别

时间:2023-03-30 14:16:02

intVal($str) 跟 (int) $str 都是把其他类型的变量转化为int型变量的方式,这么多年来我一直森森滴怀疑它们的运算结果在某些条件下会有区别。对于我的疑问,文档里也没有多说(或者我没找到),还是做个实验验证一下吧。

除了intVal函数的第二个参数可以指定$str字符串的进制形式外,对于普通的10进制数字型字符,这两种方式有什么样的区别呢?

小实验:

$arr = array(
'$a' => 19,
'$b' => 19.99,
'$c' => '19.99',
'$d' => '',
'$d' => 'sfsdf',
'$f' => '0x20',
'$e' => array('19.99')
); foreach ($arr as $k => $v){
$v = intval($v);
echo "intval({$v}) is :" , var_dump($v) , PHP_EOL;
}
echo '-----------------------', PHP_EOL;
foreach ($arr as $k => $v){
$v = (int)($v);
echo "intval({$v}) is :" , var_dump($v) , PHP_EOL;
}
die();

输出结果:

intval(19) is :int(19)

intval(19) is :int(19)

intval(19) is :int(19)

intval(0) is :int(0)

intval(0) is :int(0)

intval(1) is :int(1)

-----------------------
intval(19) is :int(19) intval(19) is :int(19) intval(19) is :int(19) intval(0) is :int(0) intval(0) is :int(0) intval(1) is :int(1)

实验分析:输出的结果有两个值得注意的地方,第一,他们的结果完全一致;第二,非空会被转化为1,空会被转为0。

实验结论:

输出结果没啥区别,但intval()毕竟是要有函数调用的,所以相比较而言会慢那么一丢丢。

课外题:

$v = intval($v);

改成

$v = intval($v * 100);

试一下,会有什么惊喜?!

另外,举一反三,其他的类型转换方式会不会有相同的答案呢?试一下吧!