php 运算符优先级:带&&和的多个表达式||

axzmvihb  于 2024-01-05  发布在  PHP
关注(0)|答案(3)|浏览(206)

我遇到了一个代码行,看起来像这样:

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

字符串
我不明白所有这些条件是如何满足的,因为它们之间没有括号:(
||&&更重要吗?首先评估哪些部分?

yvt65v4c

yvt65v4c1#

&&依赖于右表达式的求值,当左表达式为真时,||不依赖于右表达式的求值。你可以把它重写为:

  1. if(
  2. $users == 'all' ||
  3. ($_POST['user'] == 1 && $users == 'admins') ||
  4. ($_POST['user'] == 0 && $users == 'mods')
  5. )

字符串
一切都会一样。

y1aodyip

y1aodyip2#

如果没有括号,PHP将从左到右计算每个表达式,同时使用PHP的operator precedence沿着。然而,就像在任何逻辑检查中一样,将AND放入混合中可能会使事情变得混乱,并且难以阅读。

ctrmrzij

ctrmrzij3#

它开始从左到右,除非优先级超过。

  1. function rtrue($x) {
  2. static $rt = 0;
  3. echo $x . ' called true ' . ++$rt . '<br>';
  4. return true;
  5. }
  6. function rfalse($x) {
  7. static $rf = 0;
  8. echo $x . ' called false ' . ++$rf . '<br>';
  9. return false;
  10. }
  11. // all but last get called, eq: false || (true && false) || (false && true)
  12. $result1 = rfalse('a') || rtrue('b') && rfalse('c') || rfalse('d') && rtrue('e');
  13. echo '=== result '. ( $result1 ? 'true' : 'false' ) . '<br>';
  14. // first true does not get called, eq: (false && true) || true
  15. $result2 = rfalse('x') && rtrue('y') || rtrue('z');
  16. echo '=== result '. ( $result2 ? 'true' : 'false' ) . '<br>';

字符串
打印以下内容:

  1. a called false 1
  2. b called true 1
  3. c called false 2
  4. d called false 3
  5. === result false
  6. x called false 4
  7. z called true 2
  8. === result true

展开查看全部

相关问题