当处理复杂的表达式的时候,基本各种程序语言,包括PHP在内,都会遵循数学上的一套规则,也就是运算符的优先级和结合性。例如:
$foo = 5 * 10 - 1;
$foo应该是49还是45呢?如果你看不出为什么有两种可能,我们用括号来表明一下:
$foo = (5 * 10) - 1;
$foo = 5 * (10 - 1);
第一种情况中,5先乘以10再减1得到49;第二种情况先计算10减1,之后再与5相乘,得45。如果你的表达式有歧义,PHP将很根据内部的一套规则来解释你的代码,来确定先进行哪种计算。
来看一下下面的代码
$foo = 5 - 5 - 5;
像之前的表达式一样,也可能有两种可能的结果,5或-5。下面分别是二者是如何得来的:
$foo = 5 - (5 - 5);
$foo = (5 - 5) - 5;
那谁来确定那种结果是正确的呢?答案是根据操作符的结合性,来确定哪个方向的操作先被执行。中间的5左右两边各有一个减号,但是因为减号是左结合的,县进行左边的操作,因此答案是第二种,-5。
如果你认为这些听起来都很复杂,放松——这些规则只有在你没有显式表明你的指令的时候才会生效。除非你很明确这些指令,否则,尽量用括号将表达式括起来来表明你的真实意图,为了PHP,也为了阅读你源码的人。
如果你不得不依赖PHP内建的优先级和结合性规则,下面是完整的结合性列表,按照优先级从最低到最高的顺序排列:
| 结合性 | 操作符 | 
|---|---|
| 左 | , | 
| 左 | or | 
| 左 | xor | 
| 左 | and | 
| 右 | |
| 右 | = += -= *= /= .= &= |= %= ^= <<= >>= | 
| 左 | ?: | 
| 左 | || | 
| 左 | && | 
| 左 | | | 
| 左 | ^ | 
| 左 | & | 
| 无结合性 | == != === !== | 
| 无结合性 | < <= > >= | 
| 左 | << >> | 
| 左 | + - . | 
| 左 | * / % | 
| 右 | ! ~ ++ -- (int) (float) (string) (array) (object) @ | 
| 右 | [ | 
| 无结合性 | new |