Php 多布尔条件-运算符优先级

Php 多布尔条件-运算符优先级,php,if-statement,conditional,Php,If Statement,Conditional,我遇到了如下代码行: if ($users == 'all' || $_POST['user'] == 1 && $users == 'admins' || $_POST[ 'user' ] == 0 && $users == 'mods') ... 我不明白这些条件是如何满足的,因为它们之间没有括号:( |比&&更重要吗?首先计算哪些部分?&取决于右表达式的计算结果,如果左表达式为真,|则不重要。您可以将其重写为: if( $users == 'all

我遇到了如下代码行:

if ($users == 'all' || $_POST['user'] == 1 && $users == 'admins' || $_POST[ 'user' ] == 0 && $users == 'mods') ...
我不明白这些条件是如何满足的,因为它们之间没有括号:(


|
&&
更重要吗?首先计算哪些部分?

&
取决于右表达式的计算结果,如果左表达式为真,
|
则不重要。您可以将其重写为:

if(
    $users == 'all' ||
    ($_POST['user'] == 1 && $users == 'admins') ||
    ($_POST['user'] == 0 && $users == 'mods')
)

这是一样的。

没有括号,PHP将使用PHP从左到右计算每个表达式。然而,与任何逻辑检查一样,将
混合使用会使事情变得混乱,更难阅读。

除非优先顺序发生变化,否则从左到右开始计算

function rtrue($x) {
    static $rt = 0;
    echo $x . ' called true ' . ++$rt . '<br>';
    return true;
}

function rfalse($x) {
    static $rf = 0;
    echo $x . ' called false ' . ++$rf . '<br>';
    return false;
}

// all but last get called, eq: false || (true && false) || (false && true)
$result1 = rfalse('a') || rtrue('b') && rfalse('c') || rfalse('d') && rtrue('e');
echo '=== result '. ( $result1 ? 'true' : 'false' ) . '<br>';

// first true does not get called, eq: (false && true) || true
$result2 = rfalse('x') && rtrue('y') || rtrue('z');
echo '=== result '. ( $result2 ? 'true' : 'false' ) . '<br>';
您也可以在JavaScript代码片段中看到相同的行为:

var rt=0;
函数rtrue(x){
log(x,'called true',++rt);
返回true;
}
var-rf=0;
函数rfalse(x){
log(x,'called false',++rf);
返回false;
}
//除了最后一个之外,所有人都被呼叫,eq:false | | | | | | | | | | | | | | | | |
console.log('==结果',
阿尔塞('a')| |尔特鲁('b')和&rfalse('c')| |尔特鲁('d')和&rfalse('e'))
);
//第一个true不会被调用,eq:(false&&true)| true
console.log('==结果',
rfalse('x')和&rtrue('y')| | rtrue('z'))

)
当然,运算符的顺序定义得很好,就像在任何一种体面的编程语言中一样。请参阅。我使用Nandos作为助记符:Not,and,or,shortest form first。Giving~、!、&、|、&&&、| |和,ORNo,这解释了他的问题。语言(在本例中)与此无关。
a called false 1
b called true 1
c called false 2
d called false 3
=== result false
x called false 4
z called true 2
=== result true