我在http://www.phpinterviewquestions.com/php-interview-questions/operator-precedence/
找到了这个问题以下操作是真是假? (运算符优先级)
$one = true;
$two = null;
$a = isset($one) && isset($two);
$b = isset($one) and isset($two);
echo $a.'<br>';
echo $b;
我尝试了上面的代码。但只有 $b 得到回显为 1(这是真的)。 $a 没有得到回显。可能是什么原因?我原以为 $a 为 0(假)。
这与优先级无关,而是关于隐式类型转换
使用
var_dump($a);
代替 echo $a;
$a
实际上是false
,但是被回显的false
被转换为空字符串。
我认为@zerkms的答案(没有错)不是正确的答案。
@vaanipala问题(我认为)是为什么
$b
是true
和$a
是false
如果两者实际上是由相同的表达式生成的。
是的,它与 PHP 运算符优先级有关。
$a = isset($one) && isset($two);
可以重写为
$a = (isset($one)) && (isset($two));
没有什么新的或奇怪的,括号实际上是多余的。但是
and
和 or
运算符的优先级低于赋值运算符,所以该行
$b = isset($one) and isset($two);
内部分组如下:
($b = isset($one)) and (isset($two));
第一个括号的值为
true
(因为
=
的优先级高于 and
),该值被分配给 $b
。 isset($two)
是false
,所以最后一行被处理为:true and false
该运算符的结果是
false
,但是
它无处可去。所以...最后
$a
是false
,$b
是true
。 Quod erat demostrandum:-D