php运算符优先级直接影响结果,如&&高于=而and低于=,导致$a = true && false为false但$a = true and false为true;?:优先级低于=,故$x = $a ?: $b = 'fallback'中$b赋值不执行;不确定时应加括号显式控制顺序。

PHP 运算符优先级真会影响结果,不是理论问题
会,而且经常在看似简单的表达式里翻车。比如 $a = 1 + 2 * 3 得到 7 而不是 9,这不是 PHP 特有,但 PHP 里有些组合特别容易误判——尤其是混合了逻辑、比较和赋值运算符时。
最常踩坑的是 &&、|| 和 = 混用
PHP 中 && 优先级高于 =,但 and 却低于 =;同理 || 高于 =,而 or 低于 =。这种分裂设计是历史遗留,但后果很实在。
-
$a = true && false等价于$a = (true && false)→$a是false -
$a = true and false等价于($a = true) and false→$a是true,整个表达式返回false - 实际写配置开关或条件赋值时,一不留神就让变量拿到意外值,debug 时还看不出错在哪
三元运算符 ?: 和赋值连用要加括号
?: 优先级比 = 低,所以不加括号就会先执行赋值,再做三元判断。
-
$x = $a ?: 'default'安全,因为?:只作用于$a -
$x = $a ? $b : $c ?: 'default'实际等价于$x = ($a ? $b : $c) ?: 'default'—— 看似合理,但若$c是 falsy 值(如0、''),就会触发默认值,可能不是你想要的逻辑 - 更危险的是:
$x = $a ?: $b = 'fallback',这会先算$a ?: $b,再把结果赋给$x,而$b = 'fallback'根本不执行 —— 因为=优先级低于?:
不确定时就加括号,别信“我记得顺序”
PHP 手册列了 20 多级优先级,连资深开发者都记不全。与其赌记忆,不如用括号显式控制求值顺序。
立即学习“PHP免费学习笔记(深入)”;
- 所有涉及
&&/||和=的混合表达式,一律用括号包裹逻辑部分:比如写成($a && $b) ? $c : $d - 避免用
and/or做逻辑判断,除非你明确需要它们的低优先级(比如流程控制:$res = query() and log($res)) - 用
php -r "var_dump(2 + 3 * 4);"快速验证怀疑的组合,比查表快
优先级不是语法糖,是求值树的结构。少一次括号,多一个深夜 debug 的凌晨。










