当处理复杂的表达式的时候,基本各种程序语言,包括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 |