<p>运算符优先级决定“谁先算”,如高于+,故$a + $b $c</code>等价于<code>$a + ($b * $c);结合性解决同级运算顺序,PHP中+、*等左结合,赋值运算符右结合,and/or优先级远低于&&/||甚至=。</p>

运算符优先级决定“谁先算”
优先级是表达式里不同运算符之间的执行顺序规则。比如 + 和 * 同时出现,* 一定比 + 先算,因为乘法优先级高于加法。不靠括号干预的话,$a + $b * $c 等价于 $a + ($b * $c),不是 ($a + $b) * $c。
常见易错点:
-
==优先级低于&&,所以$a && $b == $c实际是$a && ($b == $c),但很多人误以为是($a && $b) == $c -
=(赋值)优先级非常低,远低于==和&&,因此if ($a = foo() == true)会先算foo() == true,再把布尔结果赋给$a,而不是先调用foo()再比较 -
and/or的优先级比&&/||更低,$a = true or false中,赋值先完成,or只是丢弃右边结果,不会影响$a
结合性解决“同级怎么算”
当多个相同优先级的运算符连写时,结合性决定计算方向。PHP 大部分二元运算符(如 +、-、*、/、&&、||)都是左结合,即从左往右算;而赋值类(=、+=、??=)和三元 ? :(PHP 8.0+)是右结合。
典型例子:
立即学习“PHP免费学习笔记(深入)”;
-
$a = $b = 5:右结合 → 等价于$a = ($b = 5),所以$b被赋值,$a也拿到同一值 -
$a - $b - $c:左结合 → 等价于($a - $b) - $c,不是$a - ($b - $c) -
$a || $b && $c:虽然&&优先级高于||,但结合性不参与——这里只看优先级,等价于$a || ($b && $c)
为什么 and 和 && 行为不同
这不是结合性差异,而是优先级差异:and 和 or 的优先级比 && 和 || 低得多,甚至低于赋值运算符 =。这导致它们在条件控制流中极易出错。
例如:
-
$res = $a && $b;:先算$a && $b,再赋值给$res -
$res = $a and $b;:先执行$res = $a,然后单独求值$b(无副作用),$res不受$b影响 - 真实陷阱:
mysql_query($sql) or die(...)能工作,是因为or优先级低,保证了查询先执行;换成&&就会逻辑反转
调试时怎么快速验证优先级和结合性
别靠记忆查表,用 var_dump() 或括号分步拆解最可靠。
实操建议:
- 对任何不确定的复合表达式,直接加括号明确意图,比如写成
($a && $b) || $c而非依赖默认行为 - 用
var_dump()打印中间结果,例如:var_dump(1 + 2 * 3, (1 + 2) * 3); - 注意 PHP 官方文档的运算符优先级表,重点标红的是
and/or/xor这组低优先级逻辑运算符 - 在条件语句或链式赋值中,尤其要检查右结合运算符是否被误当成左结合(比如
$a = $b += 2是合法且有定义的,但新手常以为它报错或不可预测)
最常被忽略的一点:优先级和结合性不是语法糖,它们直接影响 AST 构造,一旦写错,可能在看似正常的代码里埋下隐性 bug,而且不会报错、只返回错误值。



















