【问题标题】:Understanding PHP type coercion了解 PHP 类型强制
【发布时间】:2014-12-31 17:03:56
【问题描述】:
我看到了这么一小段代码,让我无法理解:
<?php
$a = '0e462097431906509019562988736854';
$b = '0e830400451993494058024219903391';
var_dump($a == $b);
将输出:
bool(true)
我了解当使用== 时,PHP 会尝试模糊比较,在类型之间进行静默转换以执行比较。我不理解的是为什么 PHP 似乎认为这两个字符串是相同的。由于$a 和$b 是字符串,我会认为不需要进行类型转换。
我不明白什么?
【问题讨论】:
标签:
php
type-conversion
dynamic-typing
【解决方案2】:
PHP 尝试转换为 float 类型,因为字符串以 0 开头。它在 0 之后停止,因为下一个字符不是数字。当您使用类型强制将科学记数法转换为整数时,也会发生同样的事情:
$x = (float)"12E-1x"; // $x == 1.2
$x = (int)"12E-1x"; // $x == 12 (stops at E because it's not an integer)
【解决方案3】:
这不是一个真正的答案,但如果你尝试
$a = '0e4620974319065090195629887368549';
$b = '0e8304004519934940580242199033918';
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b);
你得到:
0
0
bool(true)
现在,如果你尝试:
$a = '0e4620974319065090195629887368549';
$b = '1e8304004519934940580242199033918';
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b);
你得到:
0
INF
bool(false)
我的猜测是 PHP 将字符串转换为浮点数并使用获得的浮点数给出比较结果,无论如何这都不正确,但那是另一回事了。
【解决方案4】:
在官方文档中,两个变量是否相等的测试如下:
$a == $b # Equal TRUE if $a is equal to $b after type juggling.
示例
$a = 13; # Integer type
$b = "13"; # String type
var_dump($a == $b); # Will say TRUE, because juggling was made
var_dump($a === $b); # Will say FALSE, because PHP will also evaluate the type of variables :)