PHP比较相等,空字符串,“;0”;和0


PHP compare equality, empty string, "0" and 0

我了解到php中的空字符串"、0和"0"都表示false。我想知道php在比较平等时是否考虑到了这一点。

    $str = "";        
    echo ($str ==  "0") ? "yes" : "no"; // prints "no" (A)
    echo ($str ==   0)  ? "yes" : "no"; // prints "yes" (B)

行A表明php将$str和"0"进行比较,就好像它们都是字符串一样,忽略了它们都可能意味着false。但B线正在比较他们的"错误"解释。

php首先检查两个值是否具有相同的类型,如果是,则在假设相同类型的情况下检查相等性;如果不是,则使用值的布尔含义(是否涉及类型转换?)

我了解到php中的空字符串"、0和"0"都表示false。

这个说法是错误的。当强制转换为布尔型类型时,空字符串0"0"为false。否则,它们分别是空字符串、零整数或一个字符的字符串。

==检查两个变量的值。如果他们的类型不同,就会出现一些不可预测的结果(对于新手来说)。

===检查两个变量的值它们的类型。

无论如何,当您比较"0" == ""时,PHP解释器会比较两个不同的字符串。但当您使用0 == ""时,它首先将数字字符串更改为整数。空字符串等于0。所以我们最终得到了0 == 0,这是真的。

注意:"8abc"在强制转换为integer后变为8abc8在广播时变为0

手册:
-类型铸造(杂耍)
-类型比较

PHP 中有两个相等比较器

当类型相同时,它们的行为方式相同。

当类型不同时,这完全取决于:PHP不会将两个值都强制转换为布尔值。它取决于两个操作数的类型,并且有一个表可以知道PHP将做什么(请参阅第二个链接)。

我建议你阅读这个stackerflow问题PHP相等(==双重相等)和身份(==三重相等)比较运算符有何不同?

此外,用于比较的PHP手册http://au.php.net/manual/en/language.operators.comparison.php

// double equal will cast the values as needed followin quite complex rules
0 == '0' // true, because PHP casted both sides to numbers
// triple equals returns true only when type and value match
0 === '0' // false
$str = "";        
//Comparing two strings, no implicit type conversion happens. Since
// "" is not equal "0", result is FALSE
echo ($str ==  "0") ? "yes" : "no"; // prints "no" (A)
//Comparing a STRING to an INT,implicit conversion happens to convert
// the string "" to an INT. Since "" has no digits, it's evaluated
// to 0. Hence, result of comparison is TRUE    
echo ($str ==   0)  ? "yes" : "no"; // prints "yes" (B)

使用"==="进行更准确的比较。