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

ske*_*hat 9 php

在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"之间的任何字符串都将为真.

pax*_*blo 6

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

例如,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定义),则字符串将被计算为整数.在所有其他情况下,它将被评估为浮点数.

如果你想避免这种行为,那么在第一个链接中有一条说明你应该使用的注释===:

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

  • PHP很糟糕的另一个原因.两个明显不同的字符串相同. (3认同)