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