【发布时间】:2016-02-09 10:52:57
【问题描述】:
三等号我想每个人都明白;我的怀疑是关于双重平等。请阅读下面的代码。
<?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 在幕后做什么。有人可以向我解释一下这里发生了什么吗?
【问题讨论】:
-
不要试图理解 PHP,只管学习/参考任意规则表:php.net/manual/en/types.comparisons.php。
-
@John,我认为您建议的副本不正确。这里的问题是问为什么
""==[]被评估为false,尽管PHP 的类型规则很松散(我希望转换也能返回true)。我不记得以前在这里看到过这个问题。你会考虑重新开放吗? -
@Halfer 是的。我已经这样做了。
-
@halfer。凉爽的。投票支持我的答案?