几个PHP类型 - 杂耍比较,如空字符串和空数组,返回意外的结果

时间:2015-11-08 19:41:07

标签: php boolean

我认为每个人都理解三重等于;我怀疑的是双重平等。请阅读以下代码。

<?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在幕后做了什么。有人可以向我解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:1)

简单的答案是,这就是php的设计方式。

结果已在文档comparison operatorscomparison 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产生怀疑。我很想知道提供了哪些其他答案。