PHP逻辑运算符优先级奇怪地影响变量赋值结果

$var4 = 123;

function fn1($p1)
{
    return array('p1' => 1, 'p2' => 2);
}

if ($var1 = fn1(1) AND $var4 == 123)
{
    print_r($var1);
}

if ($var2 = fn1(1) && $var4 == 123)
{
    print_r($var2);
}

if (($var3 = fn1(1)) && $var4 == 123)
{
    print_r($var3);
}
  • 如果你运行这个简单的脚本,它会输出奇怪的结果,至少对我来说! 从第一个输出,如果表达式将导致从函数返回的数组&赋值给$ var1变量,这正是我所期待的,好吧?
  • 第二个输出来自第二个表达式将导致分配给$ var2变量的整数'1',这根本不值得期待! 请注意,唯一改变的是逻辑运算符,我用'&&'而不是'AND',这就是全部!
  • 来自第三个if表达式的第三个输出将再次产生从函数&赋给$ var3变量返回的期望数组,正如第一个if表达式一样,但是等待:我刚刚在括号内的if表达式中接受了赋值语句,while仍然使用第二个表达式代码!
  • 任何人都可以解释为什么这种奇怪的行为? php.net的参考链接将不胜感激。

    我知道'&&'的优先级高于'AND',但这并不能解释给我!


    PHP:运算符优先

    &&具有比=更高的优先级,因此在第二种情况下,您将fn1(1) && $var4 == 123 (true或false)的值分配给$ var2。

    在第一个if中,AND优先级低于=,因此首先进行赋值,然后比较结果。

    在第三个if中,由于所有parens中的所有内容都先被处理,所以分配再次发生。


    &&=有更高的优先级,所以真正发生的事情更像是:

    if ($var1 = (fn(1) && $var4 == 123))
    

    那么真正被分配给$ var1的是布尔结果,这就是为什么你得到1。


    PHP的AND&&操作符都是逻辑和,但是and版本的绑定优先级较低,请参阅:http://php.net/manual/en/language.operators.precedence.php

    链接地址: http://www.djcxy.com/p/10099.html

    上一篇: PHP Logical Operators precedence affects variable assignment results strangely

    下一篇: The behaviour of the or operator in PHP