3.8 表达式
表达式(expression)是一个短语,它表示程序中的某个特定动作。所有表达式至少由一个操作数和一个或多个操作符组成。下面是几个例子:

3.8.1 操作数
操作数是表达式的输入。通过每天的数学计算,以及前面的编程经验,你可能对操作数的处理和使用早已经熟悉。下面是操作数的一些例子:
![]()
3.8.2 操作符
操作符(operator)是表达式中指定某个动作的符号。许多操作符对你来说可能已经很熟悉了。无论如何,要记住PHP会根据操作符(置于两个操作数之间)的类型自动进行类型转换,这在其他编程语言中并不多见。
操作符的优先级和结合性是编程语言的重要特性。本节将介绍这两个概念。表3-3包含了所有操作符的完整列表,这里操作符按照优先级从高到低的顺序排列。
表3-3 操作符优先级、结合性和作用
|
操作符 |
结合性 |
作 用 |
|
new |
— |
对象初始化 |
|
() |
— |
建立表达式的子组 |
|
[] |
右 |
包围索引 |
|
! ~ ++ -- |
右 |
布尔非,按位取反,自增,自减 |
|
@ |
右 |
错误控制 |
|
/ * % |
左 |
除法,乘法,取模 |
|
+ - . |
左 |
加法,减法,拼接 |
|
<< >> |
左 |
左移,右移 |
|
< <= > >= |
— |
小于,小于等于,大于,大于等于 |
|
== != === <> |
— |
等于,不等于,相同,不相同 |
|
& ^ | |
左 |
位与,位异或,位或 |
|
&& || |
左 |
布尔与,布尔或 |
|
?: |
右 |
三元操作符 |
|
= += *= /= .= %=&= |= ^= <<= >>= |
右 |
赋值操作符 |
|
AND XOR OR |
左 |
布尔与,布尔异或,布尔或 |
|
, |
左 |
分隔表达式,例子: $days = array(1=>"Monday", 2=>"Tuesday") |
1. 操作符优先级
操作符优先级(operator precedence)是操作符的一个特性,确定以何种顺序计算周围的操作数。PHP遵循小学算术课所用的标准优先级规则。下面是几个例子:
![]()
可以等价地写为:
![]()
因为乘法操作符的优先级比加法操作符的高。
2. 操作符结合性
操作符的结合性(associativity)指定了相同优先级运算(即有相同的优先级值,如表3-3所示)的计算顺序。结合性可以有两个方向,从左到右或从右到左。从左到右结合性表示组成表达式的各种运算从左向右进行计算。考虑如下例子:
![]()
这个例子与下例相同:
![]()
这个表达式结果为840,因为乘法(*)操作符的结合性是从左至右。
相反,从右到左结合性将从右到左地计算相同优先级的操作符:
![]()
上面的示例与下例相同:
![]()
计算这个表达式时,变量$value、$a、$b和$c都将包含值5,因为赋值操作符(=)的结合性是从右到左。
3. 算术操作符
算术操作符如表3-4所列,用于完成各种算术运算,在许多PHP程序中将会频繁用到。幸运的是,这些算术操作符很容易使用。
表3-4 算术操作符
|
示 例 |
说 明 |
输 出 |
|
$a + $b |
加法 |
$a和$b的和 |
|
$a - $b |
减法 |
$a和$b的差 |
|
$a * $b |
乘法 |
$a和$b的乘积 |
|
$a / $b |
除法 |
$a和$b的商 |
|
$a % $b |
取模 |
$a除以$b的余数 |
顺便提一下,PHP提供了大量预定义的数学函数,能够完成基本的转换和计算对数、平方根和几何值等运算。这些函数的最新列表请查看手册。
4. 赋值操作符
赋值操作符(assignment operator)将一个数据值赋给一个变量。最简单的赋值操作符会赋某个值,有些操作符(称为快捷赋值操作符)在赋值之前会完成另外某个运算。表3-5列出了一些使用此类操作符的例子。
表3-5 赋值操作符
|
示 例 |
说 明 |
输 出 |
|
$a = 5 |
赋值 |
$a等于5 |
|
$a += 5 |
加法赋值 |
$a等于$a减5 |
|
$a *= 5 |
乘法赋值 |
$a等于$a乘以5 |
|
$a /= 5 |
除法赋值 |
$a等于$a除以5 |
|
$a .= 5 |
拼接赋值 |
$a等于$a拼接5 |
5. 字符串操作符
PHP的字符串操作符(参见表3-6)提供了拼接字符串的便捷方式。有两个这样的操作符,包括拼接操作符(.)和拼接赋值操作符(.=),这在上一节已经讨论过。
表3-6 字符串操作符
|
示 例 |
说 明 |
输 出 |
|
$a = "abc"."def"; |
拼接 |
$a赋值为字符串“abcdef” |
|
$a .= "ghijkl"; |
拼接赋值 |
$a等于它的当前值与“ghijkl”的拼接结果 |
注解 拼接(concatenate)表示将两个或多个对象组合起来,形成一个实体。
下面是一个使用字符串操作符的例子:

PHP的字符串处理功能并非只包括这两个拼接操作符。有关功能请参阅第9章。
6. 自增和自减操作符
自增(++)和自减(--)操作符如表3-7所列,为代码的简洁性提供了一些便利。这是一种简化的方式,可以将变量的当前值增1或减1。
表3-7 自增和自减操作符
|
示 例 |
说 明 |
输 出 |
|
++$a, $a++ |
自增 |
$a增1 |
|
--$a, $a-- |
自减 |
$a减1 |
这些操作符可以放在变量的任意一边,但放的位置不同会有一些略微不同的效果。考虑以下示例的输出:
![]()
可以看出,自增和自减操作符使用的顺序对变量的值有重要影响。将操作数放在操作符前面称为前自增和前自减运算,而放在后面则称为后自增和后自减运算。
7. 逻辑操作符
与算术操作符类似,逻辑操作符(参见表3-8)在许多PHP应用程序中都起到重要作用,利用逻辑操作符可以根据多个变量的值进行判断,这使得控制程序的流程成为可能。逻辑操作符常用于控制结构中,如if条件和while及for循环。
表3-8 逻辑操作符
|
示 例 |
说 明 |
输 出 |
|
$a && $b |
与 |
如果$a和$b都为true,则输出true |
|
$a AND $b |
与 |
如果$a和$b都为true,则输出true |
|
$a || $b |
或 |
如果$a或$b为true,则输出true |
|
$a OR $b |
或 |
如果$a或$b为true,则输出true |
|
!$a |
非 |
如果$a不为true,则输出true |
|
NOT $a |
非 |
如果$a不为true,则输出true |
|
$a XOR $b |
异或 |
如果只有$a或$b为true,则输出true |
逻辑操作符还常用于提供其他运算结果的详细信息,尤其是有返回值的运算:
![]()
会有两种输出:
● 文件filename.txt存在。
● 输出句子“File does not exist!”。
8. 相等操作符
相等操作符(参见表3-9)用来比较两个值,测试其相等性。
表3-9 相等操作符
|
示 例 |
说 明 |
输 出 |
|
$a == $b |
是否相等 |
如果$a和$b相等,则输出true |
|
$a != $b |
是否不相等 |
如果$a和$b不相等,则输出true |
|
$a === $b |
是否相同 |
如果$a和$b相等,并且类型也相同,则输出true |
只用一个等号测试相等性(例如$a = $b)是个很常见的错误,即使是有经验的程序员也常犯这个错误。记住,这会变成将$b的值赋给$a,而不会得到预期的结果。
9. 比较操作符
比较操作符(参见表3-10)与逻辑操作符相似,通过比较两个或多个变量值的结果,提供了一种控制程序流程的方法。
表3-10 比较操作符
|
示 例 |
说 明 |
输 出 |
|
$a < $b |
小于 |
如果$a小于$b,则输出true |
|
$a > $b |
大于 |
如果$a大于$b,则输出true |
|
$a <= $b |
小于或等于 |
如果$a小于或等于$b,则输出true |
(续)
|
示 例 |
说 明 |
输 出 |
|
$a >= $b |
大于或等于 |
如果$a大于或等于$b,则输出true |
|
($a == 12) ? 5 : -1 |
三元运算 |
如果$a等于12,返回值为5;否则返回值为-1 |
注意,比较操作符只能用来比较数值。虽然也可以使用这些操作符比较字符串,但很可能得不到预期的结果。要比较字符串值,还有另外一组预定义的函数,有关内容将在第9章详细讨论。
10. 位操作符
位操作符(bitwise operator)在组成整数值的各个“位”层次上检查和处理整数值(这正是位操作符名字的由来)。为了充分理解这个概念,需要至少对十进制数的二进制表示有一些基本了解。表3-11列出了一些十进制数及其相应的二进制表示形式。
表3-11 二进制表示形式
|
十进制整数 |
二进制表示形式 |
|
2 |
10 |
|
5 |
101 |
|
10 |
1010 |
|
12 |
1100 |
|
145 |
10010001 |
|
1 452 012 |
101100010011111101100 |
表3-12所列的位操作符是逻辑操作符的一些变体,但会得到完全不同的结果。
表3-12 位操作符
|
示 例 |
说 明 |
输 出 |
|
$a & $b |
与 |
$a和$b包含的每一位相与 |
|
$a | $b |
或 |
$a或$b包含的每一位相或 |
|
$a ^ $b |
异或 |
$a或$b包含的每一位相异或 |
|
~ $b |
非 |
$b中的每一位取反 |
|
$a << $b |
左移 |
$a将接收到$b左移两位的值 |
|
$a >> $b |
右移 |
$a将接收到$b右移两位的值 |
如果希望学习关于二进制编码和位操作符的更多知识,了解其重要性,请访问Randall Hyde提供的在线参考:The Art of Assembly Language Programming(汇编语言编程艺术),位于http://webster.cs.ucr.edu/。这是Web上的最棒的资源之一。







