PHP 中奇怪的布尔值评估行为



让我与大家分享一些PHP代码:

$var1 = '';
$var2 = 0;
echo '<pre>';
var_dump($var1 == $var2); //prints bool(true)
echo '</pre>';
echo '<pre>';
var_dump($var1 != $var2); //prints bool(false)
echo '</pre>';
echo '<pre>';
var_dump(!$var1 == $var2); //prints bool(false)
echo '</pre>';
echo '---<br />';
echo '<pre>';
var_dump($var1 === $var2); //prints bool(false)
echo '</pre>';
echo '<pre>';
var_dump($var1 !== $var2); //prints bool(true)
echo '</pre>';
echo '<pre>';
var_dump(!$var1 === $var2); //prints bool(false) .. WTFF????
echo '</pre>';

问题是...为什么最后一句话(! $var1 === $var2)不会产生与($var !== $var2) ???相同的结果我的意思是,这是我们所期望的,不是吗?

曾经交替使用这两种方式,但现在我只使用!==虽然我仍然不知道为什么另一种形式不起作用......

!$var1TRUE$var20

它们不相等,所以结果是 false .

也许你对!($var1 === $var2)感到困惑

最后一条语句的计算结果为:

(!$var1) === $var2

由于$var1是一个假值(空字符串),反转它会给你一个真值(1),它不等于(当然也不等同0!因此,比较是false .

(请注意,我在这里故意使用术语"真实"和"虚假",因为''0不太truefalse

这是一个优先级问题:

not 运算符首先应用于$var1并生成布尔值 true。布尔值 true 不精确等于 int 0,因此它的计算结果为 false。