运算符
一.php中有哪些运算符?
1. 算术运算符
用于数学运算:
运算符 | 描述 | 示例 |
---|---|---|
+ |
加 | $a + $b |
- |
减 | $a - $b |
* |
乘 | $a * $b |
/ |
除 注意分母不能为0 否则php会warning | $a / $b |
% |
取余 | $a % $b |
** |
幂运算 | $a ** $b |
2. 赋值运算符
用于给变量赋值:
将右边的结果(可以是变量,数据,常量,和其他运算出来的结果),保存到内存的某个位置,然后将位置的内存地址复制给左侧的变量或常量
运算符 | 描述 | 示例 |
---|---|---|
= |
直接赋值 | $a = 5 |
+= |
加后赋值 | $a += 3 相当于 $a = $a + 3 |
-= |
减后赋值 | $a -= 2 |
*= |
乘后赋值 | $a *= 2 |
/= |
除后赋值 | $a /= 2 |
%= |
取余后赋值 | $a %= 3 |
**= |
幂后赋值 | $a **= 2 |
例如
php
$a = $b = 10 //连贯赋值运算
3. 比较运算符
用于比较两个值:
运算符 | 描述 | 示例 |
---|---|---|
== |
等于(值相等) | $a == $b |
=== |
全等(值和类型都相等) | $a === $b |
!= 或 <> |
不等于 | $a != $b |
!== |
不全等 | $a !== $b |
< |
小于 | $a < $b |
> |
大于 | $a > $b |
<= |
小于等于 | $a <= $b |
>= |
大于等于 | $a >= $b |
<=> |
太空船运算符(比较大小,返回 -1、0、1) | $a <=> $b |
在 PHP 里,太空船运算符 (Spaceship Operator,写作 <=>
)是在 PHP 7 引入的一个比较运算符。它的作用是同时比较两个表达式的大小,返回值是一个整数:
-1
:左边小于右边0
:两边相等1
:左边大于右边
也就是三态比较,一步到位。
示例代码:
php
<?php
echo 1 <=> 1; // 0,左右相等
echo 1 <=> 2; // -1,左边小于右边
echo 2 <=> 1; // 1,左边大于右边
// 也可以用于字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
这个运算符常常用在排序函数里,写自定义比较器时非常简洁:
php
<?php
$nums = [3, 1, 4, 1, 5, 9];
// usort 里直接用 spaceship operator
usort($nums, function($a, $b) {
return $a <=> $b;
});
print_r($nums); // [1, 1, 3, 4, 5, 9]
以前要写:
if ($a == $b) return 0;
return ($a < $b) ? -1 : 1;
现在一句 $a <=> $b
就能搞定。
4. 增量/减量运算符(自操作运算符)
运算符 | 描述 | 示例 |
---|---|---|
++$a |
前置自增 | 先加 1,再使用 $a |
$a++ |
后置自增 | 先使用 $a ,再加 1 |
--$a |
前置自减 | 先减 1,再使用 $a |
$a-- |
后置自减 | 先使用 $a ,再减 1 |
-
前置:先改变,再返回改变后的值。
-
后置:先返回原值,再改变。
5. 逻辑运算符
用于布尔逻辑运算:
运算符 | 描述 | 示例 |
---|---|---|
and / && |
逻辑与(短路运算) | $a && $b |
or / ` |
` | |
xor |
异或 | $a xor $b |
! |
非 | !$a |
⚠️ 注意:
and
和&&
优先级不同,实际使用时要小心。
6. 字符串运算符(连接运算符)
运算符 | 描述 | 示例 |
---|---|---|
. |
连接 | $str1 . $str2 |
.= |
连接后赋值 (符合运算) | $str1 .= $str2 相当于 $str1 = $str1 . $str2 |
7. 数组运算符
运算符 | 描述 | 示例 |
---|---|---|
+ |
合并数组(左边元素不会被右边覆盖) | $a + $b |
== |
等于(键和值相等) | $a == $b |
=== |
全等(键值和顺序都相等) | $a === $b |
!= 或 <> |
不等 | $a != $b |
!== |
不全等 | $a !== $b |
8. 条件运算符(三元运算符)
运算符 | 描述 | 示例 |
---|---|---|
?: |
三元运算符 | $result = $a ? $b : $c; |
?? |
空合并运算符 | $a = $b ?? '默认值'; (如果 $b 存在且不为 null,就用 $b ,否则用 '默认值' ) |
9. 其他运算符
运算符 | 描述 | 示例 |
---|---|---|
@ |
错误抑制 | @file_get_contents('不存在.txt') |
instanceof |
对象类型判断 | $obj instanceof MyClass |
() |
括号,改变运算优先级 | ($a + $b) * $c |
[] |
数组下标/取值 | $arr[0] |
-> |
对象属性/方法访问 | $obj->method() |
:: |
静态成员/常量访问 | MyClass::CONST |
yield |
生成器使用 | yield $value; |
** |
幂运算 | $a ** $b |
在 PHP 里,错误抑制符 就是前面加一个 @,用来屏蔽(抑制)该表达式执行时产生的错误信息。
例子:
php
<?php
// 文件不存在,正常会报 Warning
$content = file_get_contents("not_exists.txt");
// 用 @ 抑制错误
$content = @file_get_contents("not_exists.txt");
有了 @
,即使 file_get_contents
报错,警告信息也不会显示。
一些要点
-
作用范围很小:只影响它紧贴的那个表达式。
@$a = 1 / 0; // 只抑制"除零"错误
-
性能开销:PHP 内部要临时关闭错误报告,再恢复,比较慢,不建议大量用。
-
无法完全抹掉错误:错误还是会发生,只是"对用户不显示"。日志里依然可能记录。
-
调试痛点 :如果乱用
@
,会把真正的 bug 给吞掉,让问题很难排查。
推荐替代方案
- 异常处理 :
大多数函数(如 PDO、mysqli)能设置抛出异常,可以用try...catch
捕获。 error_reporting()
+ 日志 :
可以控制只记录错误到日志,不输出到浏览器。
举个"更安全"的替代:
<?php
try {
$db = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
这样比 @$db = new PDO(...);
要强太多。
使用场景
在php中一些错误可以提前预知,但是这些错误可能无法避免,但是又不希望报错给用户看,可以使用错误抑制符处理
错误抑制符通常在生产环境(上线)会用到,在开发的时候不会用,系统本身最好没有任何错误
二.运算符优先级
优先级 | 运算符 | 说明 |
---|---|---|
1 | () |
括号,强制改变计算顺序 |
2 | ++$a --$a $a++ $a-- |
自增 / 自减 |
3 | @ |
错误抑制 |
4 | ** |
幂运算 (PHP 5.6+) |
5 | * / % |
乘、除、取余 |
6 | + - |
加、减 |
7 | << >> |
左移、右移 |
8 | & |
按位与 |
9 | ^ |
按位异或 |
10 | ` | ` |
11 | < <= > >= |
小于、小于等于、大于、大于等于 |
12 | == != === !== |
等于、不等于、全等、不全等 |
13 | <=> |
太空船运算符 (PHP 7+) |
14 | && |
逻辑与 |
15 | ` | |
16 | and |
逻辑与 (低优先级) |
17 | xor |
异或 |
18 | or |
逻辑或 (低优先级) |
19 | ? : |
三元运算符 |
20 | `= += -= *= /= %= &= | = ^= <<= >>= **=` |
21 | , |
逗号运算符,最低优先级 |
详情参考官方
https://www.php.net/manual/zh/language.operators.precedence.php
结合方向 | 运算符 | 附加信息 |
---|---|---|
不适用 | clone new |
clone 和 new |
右 | ** |
算术运算符 |
不适用 | + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ |
算术 (一元 + 和 - ), 递增/递减, 按位, 类型转换 和 错误控制 |
左 | instanceof |
类型 |
不适用 | ! |
逻辑运算符 |
左 | * / % |
算术运算符 |
左 | + - . |
算数 (二元 + 和 - ), array 和 string (. PHP 8.0.0 前可用) |
左 | << >> |
位运算符 |
左 | . |
string (PHP 8.0.0 起可用) |
无 | < <= > >= |
比较运算符 |
无 | == != === !== <> <=> |
比较运算符 |
左 | & |
位运算符 和 引用 |
左 | ^ |
位运算符 |
左 | ` | ` |
左 | && |
逻辑运算符 |
左 | ` | |
右 | ?? |
null 合并运算符 |
无关联 | ? : |
三元运算符 (PHP 8.0.0 之前左联) |
右 | = += -= *= **= /= .= %= &= ` |
= ^=` `<<=` `>>=` `??=` |
不适用 | yield from |
yield from |
不适用 | yield |
yield |
不适用 | print |
|
左 | and |
逻辑运算符 |
左 | xor |
逻辑运算符 |
左 | or |
逻辑运算符 |