我了解到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后变为8
。abc8
在广播时变为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)
使用"==="进行更准确的比较。