false和(true&& print('hi'))

时间:2017-10-21 08:43:21

标签: php logical-operators short-circuiting

在PHP中,为什么false and (true && print('hi'))评估为false而不打印'hi'?我知道逻辑运算符在短路时评估(它们是 lazy ),但是&&和括号的upper precedenceand好,所以(true && print('hi'))应该先评估。

任何线索?谢谢!

2 个答案:

答案 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的左操作数,即使+具有更高的优先级,甚至使用括号。有趣的!

感谢大家。