我认为每个人都理解三重等于;我怀疑的是双重平等。请阅读以下代码。
<?php
//function to improve readability
function compare($a,$b,$rep)
{
if($a == $b)
echo "$rep is true<br>";
else
echo "$rep is false<br>";
}
echo "this makes sense to me<br>";
compare(NULL,0,'NULL==0');
compare(NULL,"",'NULL==""');
compare(NULL,[],'NULL==[]');
compare(0,"",'0==""');
echo "now this is what I don't understand<br>";
compare("",[],'""==[]');
compare(0,[],'0==[]');
compare(0,"foo",'0=="foo"');
echo "if I cast to boolean then it makes sense again<br>";
compare("",(bool)[],'""==(bool)[]');
compare(0,(bool)[],'0==(bool)[]');
?>
输出:
这对我来说很有意义
NULL==0 is true
NULL=="" is true
NULL==[] is true
0=="" is true
现在这是我不明白的
""==[] is false
0==[] is false
0=="foo" is true
如果我转换为布尔值,那么它再次有意义
""==(bool)[] is true
0==(bool)[] is true
我希望一个空数组“等于”空字符串或整数0.我不希望整数0与字符串“foo”“相等”。说实话,我并不是真正了解PHP在幕后做了什么。有人可以向我解释这里发生了什么吗?
答案 0 :(得分:1)
简单的答案是,这就是php的设计方式。
结果已在文档comparison operators和comparison tables中明确定义。
A ==数组(前两个查询)与字符串之间的比较总是导致错误。
在数字和字符串(第三个查询)之间的==比较中,字符串将转换为数字,然后进行数字比较。在0 ==&#39; foo&#39;的情况下字符串&#39; foo&#39;以数字方式求值为0,测试变为0 == 0并返回true。如果字符串已经是数字&#39;例如&#34; 3&#34;那么你的案例中的结果将是假的(0不等于3)。
设计是否正确&#34; (无论这意味着什么)是有争议的。当然,这并不总是显而易见的。辩论的潜在愤怒的一个说明性例子可以在Bug#54547中找到,其中开发人员强烈反对设计植根于php的历史作为一种网络语言,其中一切都是字符串,应该保持独立,和其他人争论php&#34;违反了最不惊讶的原则&#34;。
为了避免不确定性,尽可能使用===,并且可能会在您的代码中显示可能无效的假设。
答案 1 :(得分:0)
正如有人已经说过的那样,PHP自动转换规则可能非常棘手,除非您知道双方的类型相同,否则值得使用===
。不过我相信我可以解释一下这个:
""==[] (returns false)
初始字符串""
表示比较将是字符串1,因此[]
被强制转换为字符串。当发生这种情况时,比较的右侧将被设置为单词Array
。因此,您正在进行此比较:
"" == "Array" (returns false)
因此false
是正确的结果。
编辑:下面有用的评论会对我的回答via this live code example产生怀疑。我很想知道提供了哪些其他答案。