我遇到了一个代码行,看起来像这样:
if ($users == 'all' || $_POST['user'] == 1 && $users == 'admins' || $_POST[ 'user' ] == 0 && $users == 'mods') ...
字符串我不明白所有这些条件是如何满足的,因为它们之间没有括号:(||比&&更重要吗?首先评估哪些部分?
||
&&
yvt65v4c1#
&&依赖于右表达式的求值,当左表达式为真时,||不依赖于右表达式的求值。你可以把它重写为:
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')
)
字符串一切都会一样。
y1aodyip2#
如果没有括号,PHP将从左到右计算每个表达式,同时使用PHP的operator precedence沿着。然而,就像在任何逻辑检查中一样,将AND放入混合中可能会使事情变得混乱,并且难以阅读。
AND
ctrmrzij3#
它开始从左到右,除非优先级超过。
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>';
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>';
字符串打印以下内容:
a called false 1b called true 1c called false 2d called false 3=== result falsex called false 4z called true 2=== result true
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
型
3条答案
按热度按时间yvt65v4c1#
&&
依赖于右表达式的求值,当左表达式为真时,||
不依赖于右表达式的求值。你可以把它重写为:字符串
一切都会一样。
y1aodyip2#
如果没有括号,PHP将从左到右计算每个表达式,同时使用PHP的operator precedence沿着。然而,就像在任何逻辑检查中一样,将
AND
放入混合中可能会使事情变得混乱,并且难以阅读。ctrmrzij3#
它开始从左到右,除非优先级超过。
字符串
打印以下内容:
型