- 算术运算符
- 赋值运算符
- 比较运算符
- 递增/递减运算符
- 逻辑运算符
- 位运算符
- 字符串运算符
- 数组运算符
- 条件赋值运算符
一、算术运算符
算术运算符用于对数值执行常见的算术操作,例如加法、减法、乘法等。
算术运算符 |
名称 |
描述 |
+x |
标识 |
根据情况将 x 转化为 int 或 float。 |
-x |
取反 |
x 的负值。 |
x + y |
加法 |
x 和 y 的和。 |
x - y |
减法 |
x 和 y 的差。 |
x * y |
乘法 |
x 和 y 的积。 |
x / y |
除法 |
x 除以 y 的商。 |
x % y |
取模 |
x 除以 y 的余数。 |
x ** y |
求幂 |
x 的 y次方的值。 |
除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
取模运算符的操作数在运算之前都会转换成 int 。
取模运算符 % 的结果和被除数的符号(正负号)相同。即 x % y 的结果和 x 的符号相同。
二、赋值运算符
基本的赋值运算符是"="。一开始可能会以为它是"等于",其实不是的。它实际上是把右边表达式的值赋给左边的运算数。
赋值运算符 |
等同于 |
描述 |
x = y |
x = y |
将左侧的操作数设置为右侧表达式的值。 |
x += y |
x = x + y |
加法赋值 |
x -= y |
x = x - y |
减法赋值。 |
x *= y |
x = x * y |
乘法赋值。 |
x /= y |
x = x / y |
除法赋值。 |
x %= y |
x = x % y |
取模赋值。 |
注意:赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。
$b = 5; // $b 的值为 5
$a = $b; // 将 $b 的值赋值给 $a,则 $a 的值为 5
$b = -5; // $b 的值更改为 -5
echo $a; // 输出 "5",对 $b 值的更改并不会影响 $a 的值
PHP 支持引用赋值,使用 "$var= &$othervar;" 语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。
$b = 5; // $b 的值为 5 $a = &$b; // $a 是 $b 的引用 $b = -5; // $b 的值更改为 -5 echo $a; // 输出 "-5",对 $b 值的更改会影响 $a 的值
三、比较运算符
比较运算符用于比较两个值(数字或字符串)。
运算符 |
名称 |
例子 |
结果 |
== |
等于 |
$x == $y |
如果 $x 等于 $y,则返回 true。 |
=== |
全等 |
$x === $y |
如果 $x 等于 $y,且它们类型相同,则返回 true。 |
!= |
不等于 |
$x != $y |
如果 $x 不等于 $y,则返回 true。 |
<> |
不等于 |
$x <> $y |
如果 $x 不等于 $y,则返回 true。 |
!== |
不全等 |
$x !== $y |
如果 $x 不等于 $y,或它们类型不同,则返回 true。 |
> |
大于 |
$x > $y |
如果 $x 大于 $y,则返回 true。 |
< |
小于 |
$x < $y |
如果 $x 小于 $y,则返回 true。 |
>= |
大于或等于 |
$x >= $y |
如果 $x 大于或等于$ y,则返回 true。 |
<= |
小于或等于 |
$x |
如果 $x 小于或等于 $y,则返回 true。 |
<=> |
太空船运算符(组合比较符) |
$x $y |
根据 $x 是小于、等于或大于 $y,分别返回一个小于、等于或大于 0 的整数。 在 PHP 7 中引入。 |
当两个操作对象都是数字字符串,或一个是数字另一个是数字字符串,就会自动按照数值进行比较。当比较时用的是 === 或 !==,则不会进行类型转换 —— 因为不仅要对比数值,还要对比类型。
四、递增 / 递减运算符
PHP 支持前/后递增与递减运算符。这些一元运算符允许将值递增或递减 1。
运算符 |
等同于 |
描述 |
++$x |
前递增 |
将 $x 增加 1,然后返回 $x。 |
$x++ |
后递增 |
返回 $x,然后将 $x 增加 1。 |
--$x |
前递减 |
将 $x 减少 1,然后返回 $x。 |
$x-- |
后递减 |
返回 $x,然后将 $x 减少 1。 |
五、逻辑运算符
逻辑运算符用于组合条件语句。(在后续的流程控制篇章中将会看到逻辑运算符的使用)
运算符 |
名称 |
例子 |
结果 |
and |
逻辑与 |
$x and $y |
如果 $x 和 $y 都为 true,则返回 true。 |
or |
逻辑或 |
$x or $y |
如果 $x 或 $y 为 true,则返回 true。 |
xor |
逻辑异或 |
$x xor $y |
如果 $x 或 $y 为 true,但不同时为 true,则返回 true。 |
&& |
逻辑与 |
$x && $y |
如果 $x 和 $y 都为 true,则返回 true。 |
|| |
逻辑或 |
$x || $y |
如果 $x 或 $y 为 true,则返回 true。 |
! |
逻辑非 |
!$x |
如果 $x 不为 true,则返回 true。 |
"与" 和 "或" 有两种不同形式运算符的原因是它们运算的优先级不同(本文最后会给出运算符优先级)。
六、位运算符
位运算符允许对整型数中指定的位进行求值和操作。
运算符 |
名称 |
描述 |
$x & $y |
And(按位与) |
将把 $x 和 $y 中都为 1 的位设为 1。 |
$x | $y |
Or(按位或) |
将把 $x 和 $y 中任何一个为 1 的位设为 1。 |
$x ^ $y |
Xor(按位异或) |
将把 $x 和 $y 中一个为 1 另一个为 0 的位设为 1。 |
~ $x |
Not(按位取反) |
将 $x 中为 0 的位设为 1,反之亦然。 |
$x |
Shift left(左移) |
将 $x 中的位向左移动 $y 次(每一次移动都表示"乘以 2")。 |
$x >> $y |
Shift right(右移) |
将 $x 中的位向右移动 $y 次(每一次移动都表示"除以 2")。 |
<< 和 >> 运算符的操作对象和结果始终都是整数。
七、字符串运算符
有两个字符串运算符。第一个是连接运算符("."),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(".="),它将右边参数附加到左边的参数之后。
运算符 |
名称 |
例子 |
结果 |
. |
连接 |
$txt1 . $txt2 |
将 $txt1 和 $txt2 连接起来。 |
.= |
连接赋值 |
$txt1 .= $txt2 |
将 $txt2 追加到 $txt1 的末尾。 |
八、数组运算符
数组运算符用于比较数组。
运算符 |
名称 |
例子 |
结果 |
+ |
联合 |
$x + $y |
返回 $x 和 $y 的联合数组。 |
== |
相等 |
$x == $y |
如果 $x 和 $y 有相同的键/值对,则返回 true。 |
=== |
全等 |
$x === $y |
如果 $x 和 $y 有相同顺序和类型的键/值对,则返回 true。 |
!= |
不相等 |
$x != $y |
如果 $x 不等于 $y,则返回 true。 |
<> |
不相等 |
$x <> $y |
如果 $x 不等于 $y,则返回 true。 |
!== |
不全等 |
$x !== $y |
如果 $x 和 $y 不全等,则返回 true。 |
九、条件赋值运算符
条件赋值运算符用于根据条件设置值。
运算符 |
名称 |
例子 |
结果 |
?: |
三元运算符 |
$x = expr1 ? expr2 : expr3 |
返回 $x 的值。 如果 expr1 为 TRUE,则 $x 的值为 expr2。 如果 expr1 为 FALSE,则 $x 的值为 expr3。 |
?? |
NULL合并运算符 |
$x = expr1 ?? expr2 |
返回 $x 的值。 如果 expr1 存在且不为 NULL,则 $x 的值为 expr1。 如果 expr1 不存在或为 NULL,则 $x 的值为 expr2。 在 PHP 7 中引入。 |
十、运算符优先级
运算符优先级指定了两个表达式绑定得有多"紧密"。例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号("*")的优先级比加号("+")高。必要时可以用括号来强制改变优先级。例如:(1+ 5) * 3 的值为 18。
如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,"="是右联的,所以 $a = $b = $c 等同于 $a = ($b = $c)。
没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 <=。
关联性仅对二(三)元操作符有意义。一元操作符是前缀或者后缀,所以不适用该概念。例如 !!$a 仅可分为 !(!$a)。
括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。
下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。