Practical PHP Programming

操作符优先级和结合性

当处理复杂的表达式的时候,基本各种程序语言,包括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
print
= += -= *= /= .= &= |= %= ^= <<= >>=
?:
||
&&
|
^
&
无结合性 == != === !==
无结合性 < <= > >=
<< >>
+ - .
* / %
! ~ ++ -- (int) (float) (string) (array) (object) @
[
无结合性 new