为什么(" 00e0" ==" 00e1")评估为真?

时间:2015-03-20 04:31:54

标签: php

在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)”字符串相比,则为真。

1 个答案:

答案 0 :(得分:6)

这是因为有效浮点值的字符串被解释为。

例如,00e0相当于0 x 100,而00e9相当于0 x 109,两者都为零,因此彼此相等。

但是,由于00ea 不是有效的浮点数,因此它的处理方式不同。

你可以看到类似的效果:

echo "01e2" - "01e1";

输出90,因为它与1 x 102 - 1 x 101100 - 10相同。

这由PHP doco(我的斜体)支持:

  

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。

该段链接到another page,它解释了转换背后的规则,如果发生的话:

  

如果字符串不包含任何字符'。','e'或'E',并且数值适合整数类型限制(由PHP_INT_MAX定义),则字符串将被计算为整数。在所有其他情况下,它将被评估为浮动。

如果您想避免这种行为,请在第一个链接中注明您应该使用===代替:

  

当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。