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

时间:2012-01-17 16:24:38

标签: php variable-assignment logical-operators operator-precedence

$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);
}
  1. 如果你运行这个简单的脚本,它会输出奇怪的结果,at 至少对我来说!!第一个if表达式的第一个输出将导致 从函数&返回的数组分配给$ var1 变量,这是我期待的,好吗?
  2. 第二个if表达式的第二个输出将产生一个整数 分配给$ var2变量的'1',这根本不是预期的! 请注意,唯一改变的是逻辑运算符, 我用'&&'而不是'AND',这就是!!
  3. 来自第三个if表达式的第三个输出将再次产生预期结果 从函数&返回的数组分配给$ var3变量, 正如第一个if表达式一样,但等待:我刚刚接受了 赋值语句在括号内的if表达式中 仍然使用第二个if表达式代码!!
  4. 任何人都可以在技术上解释 - 在细节 - 为什么这种奇怪的行为? php.net参考链接将不胜感激。

    我知道'&&'优先级高于'AND',但这并没有向我解释!!

3 个答案:

答案 0 :(得分:3)

PHP: Operator Precendence

&安培;&安培;优先级高于=,所以在第二个if中,您将fn1(1) && $var4 == 123(true或false)的值赋给$ var2。

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

在第三个if中,赋值再次发生,因为parens中的所有内容都先被处理。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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