查PHP运算符优先级应直接参考官方operator_precedence表,避免记忆错误;混用&&/||与and/or、位运算与比较、?:与??时务必加括号明确分组。

PHP 运算符优先级怎么快速查?别背,用 operator_precedence 查表就行
PHP 官方文档里有一张明确的operator_precedence 表,它就是唯一权威依据。别靠记忆或“感觉”,尤其当表达式混用 &&、||、and、or 或赋值运算符时,顺序错一丁点就出 bug。
常见错误现象:$a = $b || $c 看似想“先算 || 再赋值”,实际是 $a = ($b || $c)(因为 = 优先级低于 ||),但 $a = $b or $c 却是 ($a = $b) or $c(因为 or 优先级远低于 =)——这俩看着像,行为天差地别。
- 使用场景:写条件判断、链式赋值、函数参数中嵌套表达式时必须确认优先级
-
and/or优先级比&&/||低得多,仅用于控制流程(比如$file = fopen(...) or die(...)),日常逻辑判断一律用&&/|| - 位运算符(
&、|、^)优先级比比较运算符(==、!=)高,所以$a & $b == $c实际等价于$a & ($b == $c),不是你想的($a & $b) == $c
什么时候必须加括号?只要不确定,就加
括号不是“代码不优雅”的标志,而是避免歧义最廉价的手段。PHP 不会因为你多写了括号报错,但少写一个可能让整个条件反转。
常见错误现象:if ($x & 1 == 0) 总是 false,因为 == 先算;$result = $a + $b * $c << $d 中,* 和 << 谁先?查表发现 * 更高,但没人能秒答,不如写成 $result = $a + ($b * $c) << $d。
立即学习“PHP免费学习笔记(深入)”;
- 所有涉及位运算、算术、比较、逻辑混合的表达式,加括号
- 赋值运算符右侧有多个操作符时,显式分组(比如
$x = ($a & $b) ? $c : $d) - 函数调用内嵌表达式,如
foo($a + $b * $c),哪怕你记得*优先,也建议写成foo($a + ($b * $c))—— 后续维护的人不一定记得
?: 和 ?? 的优先级陷阱
??(空合并)优先级比 ?:(三元)低,而且都比 = 低。这是最容易翻车的组合之一。
常见错误现象:$x = $a ?: $b ?? $c 实际解析为 $x = ($a ?: $b) ?? $c,而不是 $x = $a ?: ($b ?? $c);更危险的是 $x = $a ?? $b ?: $c,它等价于 ($x = $a ?? $b) ?: $c —— 注意,$x 被赋了值,但整个表达式结果却是 $c(如果 $a ?? $b 为真)。
-
??只对null和未定义变量生效,?:对所有 falsy 值(0、''、false)都生效,别混用 - 嵌套三元时,
?:是右结合的($a ?: $b ?: $c等价于$a ?: ($b ?: $c)),但加上??就立刻打破这个直觉 - 安全写法:永远用括号隔离
??和?:,比如$x = ($a ?? $b) ?: $c或$x = $a ?: ($b ?? $c)
PHP 8 的新变化:match 表达式不参与优先级计算
match 是表达式,不是语句,但它有自己的求值边界。它不会和周围运算符“粘连”,相当于自带括号。
常见错误现象:有人试图写 $x = $a + match($b) { ... } * $c,以为 match 会像函数调用一样被算进去——其实没问题,match 整体先求值,再参与外部运算。但如果你在 match 分支里写复杂表达式,分支内部仍要按优先级规则来。
-
match本身不改变外部优先级逻辑,但它返回值是纯结果,不带副作用(不像switch) - 分支中的表达式仍需注意优先级,比如
1 => $x & $y == 0,这里==还是比&高 - PHP 8.1+ 支持逗号分隔多个条件,但逗号不是运算符,不涉及优先级,只是语法糖
真正麻烦的从来不是记不住哪条规则,而是你以为自己记住了,结果在 ?? 和 ?: 之间、and 和 && 之间、或者位运算和比较之间,漏掉了一次括号。



















