php运算符结合性规定同优先级运算符的计算顺序:多数二元运算符(如+、-、*、/、=、.=)左结合,**和赋值类运算符右结合,三元运算符?:左结合但需括号避免弃用警告。

PHP 运算符结合性决定表达式怎么分组
当多个相同优先级的运算符连用时,结合性决定计算顺序是“从左往右”还是“从右往左”。这不是可选项,是 PHP 解析器硬编码的行为——写 $a - $b - $c 就一定是 ($a - $b) - $c,不是 $a - ($b - $c);而 $a ** $b ** $c 是 $a ** ($b ** $c),不是左结合。
哪些运算符是左结合?哪些是右结合?
绝大多数二元运算符(+、-、*、/、%、==、&&、||、=、.= 等)都是左结合。例外很明确:
-
**(幂运算)是右结合:2 ** 3 ** 2→2 ** (3 ** 2)→2 ** 9→512 - 赋值类运算符(
=、+=、-=、.=等)也是右结合:$a = $b = 5等价于$a = ($b = 5),所以两个变量都得5 - 三元运算符
?:是左结合,但实际中强烈建议用括号:PHP 7.4+ 已废弃无括号的嵌套三元,$a ? $b : $c ? $d : $e会被警告
不加括号时,结合性错误会导致结果意外
常见误判场景:
-
$x = 10 - 3 - 2:左结合 →(10 - 3) - 2 = 5,不是10 - (3 - 2) = 9 -
$y = 2 ** 3 ** 2:右结合 →2 ** (3 ** 2) = 512,如果按左结合会是(2 ** 3) ** 2 = 64 -
$a = $b += 5:右结合 → 先算$b += 5,再把结果赋给$a;等价于$b = $b + 5; $a = $b; - 混用
and/or和&&/||:它们优先级不同,&&比and高得多,$a && $b or $c实际是($a && $b) or $c,不是$a && ($b or $c)—— 这里结合性没起作用,是优先级在作怪
什么时候必须加括号?
只要表达式读起来有歧义,或者你不能 100% 确认当前运算符的结合方向和优先级,就加括号。尤其注意:
立即学习“PHP免费学习笔记(深入)”;
- 幂运算连用:
2 ** 3 ** 2不如写成2 ** (3 ** 2)直观 - 赋值链式操作:
$a = $b = $c = 0安全,但$a = $b += 1建议拆成两行或加括号 - 三元嵌套:
$res = $cond1 ? $val1 : ($cond2 ? $val2 : $val3),不加内层括号 PHP 会报Deprecated: Unparenthesized `a ? b : c ? d : e` is deprecated - 混合逻辑运算符:
if ($a || $b && $c)实际是$a || ($b && $c),但靠记忆不如写成if ($a || ($b && $c))
结合性本身不难记,难的是它和优先级搅在一起时,人脑容易默认“从左到右”,而 PHP 并不总是买账。










