我最近遇到了一个困扰我的错误……追溯到以下(简化的)statmement,它提供了一个真实的示例
function test_it($team)
{ echo (($team=="a") ? "Yep it is!" : "No Way");
}
所以,如果我执行test_it(0);
,我得到的结果是"是的!"??
这句话的逻辑看起来很好,但很明显,为了得到正确的结果,我需要做"==="。。。。
有人能解释为什么会这样吗?只是为了帮助我理解为什么/将来应该避免什么。
这是因为a的字符串/字符,即"a"并通过0。
===操作员执行"类型安全比较"
此处的解释和问题
这是因为类型杂耍会使"a"
变成一个整数进行比较。所以实际上这就是正在运行的:
if (0 == (int)"a")
当然,(int)"a"
将评估为0
,您可以在这里阅读更多关于类型杂耍的信息。
检查此链接。
使用==
可以执行松散比较。根据链接中的表,0
(整数)和"something"
(字符串)之间的这种类型的比较将产生TRUE
。
==运算符只是检查左值和右值是否相等。但是,===运算符(注意额外的"=")实际上会检查左值和右值是否相等,也会检查它们是否属于相同的变量类型(比如它们是否都是布尔值、int值等)
现在做一个echo (int)"a";
,你会得到一个0,它对任何字符串都有效。
在PHP中,任何不以数值开头的字符串都是==
到0。例如,这里有一个具有各种比较的样本,以及由此产生的echo
:
$team = 0;
echo (($team=="a") ? "Yep it is!" : "No Way"); // Yep it is!
echo (($team=="abc") ? "Yep it is!" : "No Way"); // Yep it is!
echo (($team=="a really long string") ? "Yep it is!" : "No Way"); // Yep it is!
显然,这实际上不是一个bug,请在此处阅读更多信息>https://bugs.php.net/bug.php?id=44999.