PHP逻辑运算符优先级会奇怪地影响变量赋值结果 如果你运行这个简单的脚本,它会输出奇怪的结果 至少对我来说!!第一个if表达式的第一个输出将导致 从函数返回的数组&分配给$var1 变量,这正是我所期望的,好吗 第二个if表达式的第二个输出将产生一个整数 “1”分配给$var2变量,这完全不是预期的!! 请注意,唯一更改的是逻辑运算符, 我用了“&&”而不是“AND”,仅此而已 来自第三个if表达式的第三个输出将再次产生预期结果 从函数返回的数组&分配给$var3变量, 与第一个if表达式完全相同,但请稍候:我刚刚接受了 if表达式中的赋值语句在括号内,而 仍然使用第二个if表达式代码

PHP逻辑运算符优先级会奇怪地影响变量赋值结果 如果你运行这个简单的脚本,它会输出奇怪的结果 至少对我来说!!第一个if表达式的第一个输出将导致 从函数返回的数组&分配给$var1 变量,这正是我所期望的,好吗 第二个if表达式的第二个输出将产生一个整数 “1”分配给$var2变量,这完全不是预期的!! 请注意,唯一更改的是逻辑运算符, 我用了“&&”而不是“AND”,仅此而已 来自第三个if表达式的第三个输出将再次产生预期结果 从函数返回的数组&分配给$var3变量, 与第一个if表达式完全相同,但请稍候:我刚刚接受了 if表达式中的赋值语句在括号内,而 仍然使用第二个if表达式代码,php,variable-assignment,logical-operators,operator-precedence,Php,Variable Assignment,Logical Operators,Operator Precedence,有人能从技术上详细解释为什么会有这种奇怪的行为吗?php.net参考链接将不胜感激。 我知道“&&”的优先级高于“AND”,但这并不能向我解释PHP的和以及&运算符都是逻辑AND,但是和版本具有较低的绑定优先级,请参见:PHP的和以及&运算符都是逻辑AND,但是和版本具有较低的绑定优先级,请参见: &&优先级高于=,因此在第二个if中,您将fn1(1)&&&$var4==123(true或false)的值赋值给$var2 在第一个if中,AND的优先级低于=,因此先进行赋值,然后比较结果 在第三

有人能从技术上详细解释为什么会有这种奇怪的行为吗?php.net参考链接将不胜感激。


我知道“&&”的优先级高于“AND”,但这并不能向我解释PHP的
以及
&
运算符都是逻辑AND,但是
版本具有较低的绑定优先级,请参见:

PHP的
以及
&
运算符都是逻辑AND,但是
版本具有较低的绑定优先级,请参见:

&&优先级高于=,因此在第二个if中,您将
fn1(1)&&&$var4==123(true或false)的值赋值给$var2

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

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

&&优先级高于=,因此在第二个if中,您将
fn1(1)&&&$var4==123(true或false)的值赋值给$var2

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


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

&&
的优先级高于
=
,因此实际发生的情况更像:

$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的是布尔结果,这就是为什么会得到1。

&&
的优先级高于
=
,因此实际发生的情况更像:

$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的是布尔结果,这就是为什么会得到1