比较运算符类型杂耍和布尔运算


Comparison Operator - Type Juggling and Booleans

我一直在阅读关于Type Juggling和Booleans的PHP文档,但我仍然不明白为什么这个比较结果为true。我的[不正确]理解告诉我,在下面的if语句中,整数0被视为FALSE,而"a"作为非空字符串被视为TRUEALSE==TRUE,最终解析为FALSE。我错了哪一部分?

   <?php
            if(0 == "a"){
                    $result = "TRUE";
            }else{
                    $result = "FALSE";
            }
            //$result == "TRUE"
    ?>

http://codepad.viper-7.com/EjxBF5

当PHP执行字符串时<=>整数比较,它试图以智能的方式将字符串转换为数字。假设您有一个字符串"42",则需要将42与另一个整数进行比较。如果字符串不是以数字开头,则其值为零。

来自文档:

该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则这将是所使用的值。否则,该值将为0(零)。

在比较文档中也推断出了这种行为(参见第一个示例中的第一行)。

您的错误是假设operator ==在比较它们之前将其每个操作数强制为布尔值。它没有这样的作用。

发生的情况是,由于您将整数与字符串进行比较,因此字符串将转换为整数(在本例中为"a" converts to 0),然后执行比较0 == 0

如果使用严格比较===而不是==,它将起作用。严格的比较还会检查变量的类型,因此0 === 'a'将为false。