在PHP中,为什么false and (true && print('hi'))
评估为false
而不打印'hi'
?我知道逻辑运算符在短路时评估(它们是 lazy ),但是&&
和括号的upper precedence比and
好,所以(true && print('hi'))
应该先评估。
任何线索?谢谢!
答案 0 :(得分:0)
它实际上是一个很好的测试示例,用于显示评估顺序。
评估从左到右进行。
所以要为你的例子添加一些内容......
<?php
// Evaluates Left to right
// Prints HI as (true && print('Hi') evaluates as TRUE
// Then the && FALSE is tested and it fails
if((true && print('Hi')) && FALSE){
echo 'Success';
} else {
echo 'Failed';
}
// Evaluates Left to right
// FALSE is evaluated and Fails
// No further checking is performed
if(FALSE && (true && print('Hi'))){
echo 'Success';
} else {
echo 'Failed';
}
注意:我没有加入AND vs&amp;&amp;但是你会得到相同的结果。
答案 1 :(得分:0)
我可以在http://php.net/manual/en/language.operators.precedence.php中看到以下内容:
运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。 PHP(在一般情况下)不指定表达式的评估顺序,应避免使用假定特定评估顺序的代码,因为行为可以在PHP版本之间或根据周围代码进行更改。
所以,我测试了以下内容:
print('one') and (1 + print('two'))
并打印:
onetwo
所以PHP首先评估and
的左操作数,即使+
具有更高的优先级,甚至使用括号。有趣的!
感谢大家。