在PHP中,为什么下面两个语句的前两个会评估为真?
<?php
if("00e0" == "00e1") {
echo 'matches (a)';
} else {
echo 'failed (a)';
}
if("00e1" == "00e9") {
echo 'matches (b)';
} else {
echo 'failed (b)';
}
if("00e2" == "00ea") {
echo 'matches (c)';
} else {
echo 'failed (c)';
}
?>
如果运行,将返回以下内容:
matches (a)
matches (b)
failed (c)
“00e0”,“00e1”,“00e2”......“00e9”之间的任何字符串如果与另一个“00e(0-9)”字符串相比,则为真。
答案 0 :(得分:6)
这是因为有效浮点值的字符串被解释为。
例如,00e0
相当于0 x 100
,而00e9
相当于0 x 109
,两者都为零,因此彼此相等。
但是,由于00ea
不是有效的浮点数,因此它的处理方式不同。
你可以看到类似的效果:
echo "01e2" - "01e1";
输出90
,因为它与1 x 102 - 1 x 101
或100 - 10
相同。
这由PHP doco(我的斜体)支持:
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。
该段链接到another page,它解释了转换背后的规则,如果发生的话:
如果字符串不包含任何字符'。','e'或'E',并且数值适合整数类型限制(由PHP_INT_MAX定义),则字符串将被计算为整数。在所有其他情况下,它将被评估为浮动。
如果您想避免这种行为,请在第一个链接中注明您应该使用===
代替:
当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。