PHP 运算符

运算符是可以通过给出的一或多个值(编程行话:表达式)来产生另一个值(表达式)的东西。


表达式

表达式是 PHP 最重要的基石,在 PHP 中几乎所写的任何东西都是一个表达式,表达式就是“任何有值的东西”。


算术运算符

算术运算符
例子名称结果
+$a标识根据情况将 $a 转化为 int 或 float。
-$a取反$a 的负值。
$a + $b加法$a 和 $b 的和。
$a - $b减法$a 和 $b 的差。
$a * $b乘法$a 和 $b 的积。
$a / $b除法$a 除以 $b 的商。
$a % $b取模$a 除以 $b 的余数。
$a ** $b求幂$a 的 $b次方的值。

赋值运算符

基本赋值运算符“=”,把右边表达式的值赋给左边的变量。

<?php

$a = ($b = 4) + 5; // $a 现在成了 9,而 $b 成了 4。

引用赋值运算符“&”,使用“$var = &$othervar;”语法,引用赋值意味着两个变量指向了同一个数据。

<?php
$a = 3;
$b = &$a; // $b 是 $a 的引用

print "$a\n"; // 输出 3
print "$b\n"; // 输出 3

$a = 4; // 修改 $a

print "$a\n"; // 输出 4
print "$b\n"; // 也输出 4,因为 $b 是 $a 的引用,因此也被改变

算术赋值运算符:

例子等同于操作
$a += $b$a = $a + $b加法
$a -= $b$a = $a - $b减法
$a *= $b$a = $a * $b乘法
$a /= $b$a = $a / $b除法
$a %= $b$a = $a % $b取模
$a **= $b$a = $a ** $b指数

位赋值运算符:

例子等同于操作
$a &= $b$a = $a & $b按位与
$a |= $b$a = $a | $b按位或
$a ^= $b$a = $a ^ $b按位异或
$a <<= $b$a = $a << $b左移
$a >>= $b$a = $a >> $b右移

其他赋值运算符:

例子
等同于操作
$a .= $b$a = $a . $b字符串拼接
$a ??= $b$a = $a ?? $bNULL 合并

位运算符

位运算符允许对整型数中指定的位进行求值和操作。

例子名称结果
$a & $bAnd(按位与)将把 $a 和 $b 中都为 1 的位设为 1。
$a | $bOr(按位或)将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $bXor(按位异或)将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $aNot(按位取反)将 $a 中为 0 的位设为 1,反之亦然。
$a << $bShift left(左移)将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $bShift right(右移)将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

位移在 PHP 中是数学运算,向任何方向移出去的位都被丢弃。

左移时右侧以零填充,符号位被移走意味着正负号不被保留。

右移时左侧以符号位填充,正负号被保留。


比较运算符

比较两个值的大小。

例子名称结果
$a == $b等于true,如果类型转换后 $a 等于 $b。
$a === $b全等true,如果 $a 等于 $b,并且它们的类型也相同。
$a != $b不等true,如果类型转换后 $a 不等于 $b。
$a <> $b不等true,如果类型转换后 $a 不等于 $b。
$a !== $b不全等true,如果 $a 不等于 $b,或者它们的类型不同。 
$a < $b小与true,如果 $a 严格小于 $b。
$a > $b大于true,如果 $a 严格大于 $b。
$a <= $b小于等于true,如果 $a 小于或者等于 $b。
$a >= $b大于等于true,如果 $a 大于或者等于 $b。
$a <=> $b太空船运算符(组合比较符)当$a小于、等于、大于 $b时 分别返回一个小于、等于、大于0的 int 值。

错误控制运算符(不建议使用)

错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式产生的任何错误信息都被忽略掉。

@ 运算符只对表达式有效,不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。

<?php
/* 故意引发文件错误 */
$my_file = @file ('non_existent_php_file') or
    die ("Failed opening file: error was '" . error_get_last()['message'] . "'");

// 即使$key不存在也不会报错
$value = @$cache[$key];

执行运算符

执行运算符:反引号(``),将反引号中的内容作为 shell 命令来执行,并将其输出信息返回,效果与函数 shell_exec() 相同。

<?php
$output = `ls -al`;
echo "<pre>$output</pre>";

注意:禁用 shell_exec() 时反引号运算符是无效的。


递增/递减运算符

例子名称效果
++$a前加$a 的值加一,然后返回 $a。
$a++后加返回 $a,然后将 $a 的值加一。
--$a前减$a 的值减一, 然后返回 $a。
$a--后减返回 $a,然后将 $a 的值减一。

逻辑运算符

例子名称结果
$a and $bAnd(逻辑与)true,如果 $a 和 $b 都为 true。
$a or $bOr(逻辑或)true,如果 $a 或 $b 任一为 true。
$a xor $bXor(逻辑异或)true,如果 $a 或 $b 任一为 true,但不同时是。
! $aNot(逻辑非)true,如果 $a 不为 true。
$a && $bAnd(逻辑与)true,如果 $a 和 $b 都为 true。
$a || $bOr(逻辑或)true,如果 $a 或 $b 任一为 true。

字符串运算符

连接运算符(“.”):返回其左右参数连接后的字符串。

连接赋值运算符(“.=”):将右边参数附加到左边的参数之后。

<?php
$a = "Hello ";
$b = $a . "World!"; // 现在 $b 是 "Hello World!"

$a = "Hello ";
$a .= "World!";     // 现在 $a 是 "Hello World!"

数组运算符

例子名称结果
$a + $b联合$a 和 $b 的联合。
$a == $b相等如果 $a 和 $b 具有相同的键/值对则为 true。
$a === $b全等如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 true。
$a != $b不等如果 $a 不等于 $b 则为 true。
$a <> $b不等如果 $a 不等于 $b 则为 true。
$a !== $b不全等如果 $a 不全等于 $b 则为 true。

类型运算符

类型运算符( instanceof ):用于确定一个 PHP 变量是否属于某一类 class 的实例。

<?php
class MyClass
{
}

class NotMyClass
{
}

$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);

运算符优先级

注意:为保证可读性,要用括号确保想要的优先级。

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。

结合方向运算符附加信息
不适用clone newclone 和 new
**算术运算符
不适用++ -- ~ (int) (float) (string) (array) (object) (bool) @ 类型、递增/递减
instanceof类型
不适用!逻辑运算符
* / %算术运算符
+ - .算术运算符 和 字符串运算符
<< >>位运算符
< <= > >=比较运算符
== != === !== <> <=>比较运算符
&位运算符 和 引用
^位运算符
|位运算符
&&逻辑运算符
||逻辑运算符
??null 合并运算符
? :三元运算符
= += -= *= **= /= .= %= &= |= ^= <<= >>= ??=赋值运算符
不适用yield fromyield from
不适用yieldyield
不适用printprint
and逻辑运算符
xor逻辑运算符
or逻辑运算符