Php 为什么(";00e0";=";00e1";)的计算结果为真?

Php 为什么(";00e0";=";00e1";)的计算结果为真?,php,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"

在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)';
    }
?>

“00e0”、“00e1”、“00e2”之间的任何字符串。。如果与另一个“00e(0-9)”字符串比较,“00e9”将给出true。

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

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

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

您可以通过以下方式看到类似的效果:

echo "01e2" - "01e1";
它输出
90
,因为它与
1x102-1x101
100-10
相同

这由(我的斜体字)支持:

如果将数字与字符串进行比较,或者比较涉及数字字符串,则会将每个字符串转换为数字,并以数字形式执行比较

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

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

如果您想避免这种行为,第一个链接中有一条说明,说明您应该使用
==

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


你的术语错了。这里没有“回报”。你说的是评估。PHP糟糕的另一个原因。两个明显不同的字符串是相等的。@Lego,我不喜欢PHP,但该语言有办法避免这种情况,根据我的更新,PHP爱好者无疑会知道这一点。因此,它在概念上与C中不正确的
if(str==“另一个字符串”)
没有什么不同,初学者经常使用它。@legostrmtroppr如果你想比较字符串是否相等,你显然要使用===not==。实际上,
e
之前的部分被解释为八进制符号,0^x加x≥ 0总是0。@Gumbo,关于
0^x
的一点是误导性的-它实际上是
0*10^x
,尽管仍然是零,因为事实上你正在乘以零。但我不认为它是八进制的,它的语句
echo“010e0”-0为您提供10而不是8。它还声明它在封面下使用
strtod
,不处理八进制。
echo "01e2" - "01e1";