php基础-.运算符 (第11天)

运算符

一.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 报错,警告信息也不会显示。


一些要点

  1. 作用范围很小:只影响它紧贴的那个表达式。

    复制代码
    @$a = 1 / 0;  // 只抑制"除零"错误
  2. 性能开销:PHP 内部要临时关闭错误报告,再恢复,比较慢,不建议大量用。

  3. 无法完全抹掉错误:错误还是会发生,只是"对用户不显示"。日志里依然可能记录。

  4. 调试痛点 :如果乱用 @,会把真正的 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 clonenew
** 算术运算符
不适用 + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 算术 (一元 +-), 递增/递减按位类型转换错误控制
instanceof 类型
不适用 ! 逻辑运算符
* / % 算术运算符
+ - . 算数 (二元 +-), arraystring. PHP 8.0.0 前可用)
<< >> 位运算符
. string (PHP 8.0.0 起可用)
< <= > >= 比较运算符
== != === !== <> <=> 比较运算符
& 位运算符引用
^ 位运算符
` `
&& 逻辑运算符
`
?? null 合并运算符
无关联 ? : 三元运算符 (PHP 8.0.0 之前左联)
= += -= *= **= /= .= %= &= ` = ^=` `<<=` `>>=` `??=`
不适用 yield from yield from
不适用 yield yield
不适用 print print
and 逻辑运算符
xor 逻辑运算符
or 逻辑运算符
相关推荐
WayneJoon.H5 小时前
CTFSHOW 中期测评(二)web502 - web516
安全·网络安全·php·web·ctf
努力学习的小廉7 小时前
深入了解linux网络—— 网络编程基础
linux·网络·php
Q_Q5110082857 小时前
python+springboot+vue的旅游门票信息系统web
前端·spring boot·python·django·flask·node.js·php
haveyb8 小时前
10分钟快速部署PHP+Nginx+MySQL+Redis开发环境
redis·mysql·nginx·docker·php
BingoGo4 天前
phpkg 让 PHP 摆脱 Composer 依赖地狱
后端·php
BingoGo5 天前
PHP 和 Elasticsearch:给你的应用加个强力搜索引擎
后端·php
A码农先森5 天前
PHP转Go系列 | PHP8 这些新函数让你眼前一亮
php
BingoGo6 天前
PHP 如何利用 Opcache 来实现保护源码
后端·php
BingoGo7 天前
2025 年 PHP 常见面试题整理以及对应答案和代码示例
后端·php