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 逻辑运算符
相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe5 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5