PHP 手册
后退 |  | 前进

# 章 15. 运算符

运算符是可以通过给出的一或多个值（用编程行话来说，表达式）来产生另一个值（因而整个结构成为一个表达式）的东西。所以可以认为函数或任何会返回一个值（例如 print）的结构是运算符，而那些没有返回值的（例如 echo）是别的东西。

有三种类型的运算符。第一种是一元运算符，只运算一个值，例如 !（取反运算符）或 ++（加一运算符）。第二种是有限二元运算符，PHP 支持的大多数运算符都是这种。列表见下节运算符优先级。

第三种是三元运算符：?:。它应该被用来根据一个表达式在另两个表达式中选择一个，而不是用来在两个语句或者程序路线中选择。把整个三元表达式放在扩号里是个很好的主意。

# 运算符优先级

运算符优先级指定了两个表达式绑定得有多“紧密”。例如，表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号（“*”）的优先级比加号（“+”）高。必要时可以用括号来强制改变优先级。例如：(1 + 5) * 3 的值为 18。如果运算符优先级相同，则使用从左到右的左联顺序。

下表从高到低列出了运算符的优先级。同一行中的运算符具有相同优先级，此时它们的结合方向决定求值顺序。

表格 15-1. 运算符优先级

结合方向 | 运算符 | 附加信息
--- | --- | ---
非结合 | new | new
左 | [ | array()
非结合 | ++ -- | 递增／递减运算符
非结合 | ! ~ - (int) (float) (string) (array) (object) @ | 类型
左 | * / % | 算数运算符
左 | + - . | 算数运算符和字符串运算符
左 | << >> | 位运算符
非结合 | < <= > >= | 比较运算符
非结合 | == != === !== | 比较运算符
左 | & | 位运算符和引用
左 | ^ | 位运算符
左 | | | 位运算符
左 | && | 逻辑运算符
左 | || | 逻辑运算符
左 | ? : | 三元运算符
右 | = += -= *= /= .= %= &= |= ^= <<= >>= | 赋值运算符
左 | and | 逻辑运算符
左 | xor | 逻辑运算符
左 | or | 逻辑运算符
左 | , | 多处用到

左联表示表达式从左向右求值，右联相反。

例子 15-1. 结合方向

`<?php $a = 3 * 3 % 5; // (3 * 3) % 5 = 4 $a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 $a = 1; $b = 2; $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 ?>`

使用括号可以增强代码的可读性。

> 注: 尽管 ! 比 = 的优先级高，PHP 仍旧允许类似如下的表达式：if (!$a = foo())，在此例中 foo() 的输出被赋给了 $a。

后退 | 起点 | 前进
表达式 | 上一级 | 算术运算符