php 8 稳定支持 php 7.4 引入的 ??= 运算符,仅在变量为 null 或未定义时赋值,不覆盖 false、0、'' 等假值;适用于数组键、超全局变量默认初始化,但不可用于函数调用或表达式左侧。

PHP 8 完全支持 `??=` 运算符(空合并赋值运算符),它不是 PHP 8 新增的——而是从 PHP 7.4 就已引入,PHP 8 继承并稳定使用该特性。它的作用很明确:只在变量为 null 或未定义时才赋值,其他任何值(包括 false、0、'')都保持原样,不覆盖。
数组键值的默认设置最常用
处理配置数组、请求参数或会话数据时,避免反复写 isset() 和 if 判断:
-
$config['host'] ??= 'localhost';—— 若$config['host']不存在或为null,才设为'localhost' -
$user['age'] ??= 18;—— 年龄没传?默认 18,但若传了0(真实年龄为 0 的婴儿),也不会被改成 18 - 链式写法也安全:
$data['meta']['created_by'] ??= 'system';,只要路径中任意一级为null或未定义,整条表达式就短路,不报错(前提是 PHP 7.4+,且开启error_reporting不含E_NOTICE级别警告)
与 $_GET / $_POST / $_SESSION 配合省代码
用户输入不可信,用 ??= 初始化比三元或 if 更简洁:
-
$_SESSION['cart_id'] ??= uniqid('cart_');—— 购物车 ID 首次访问生成,后续复用 -
$_GET['page'] ??= 1;—— 分页默认第 1 页,即使 URL 没带?page=也不报未定义索引 - 注意:
$_GET['limit'] ??= 20;中,如果 URL 是?limit=0,0不是null,所以不会被覆盖,逻辑更准确
和普通赋值、?: 的关键区别
别把 ??= 和 ?: 混用,语义完全不同:
-
$x ??= 'default';:仅当$x === null或未定义时触发 -
$x ?: 'default';:只要$x是“假值”(false、0、''、[]等)就触发,容易误覆盖合法数据 -
$x = $x ?? 'default';功能等价于$x ??= 'default';,但后者更短、更直观
不能用在表达式左侧的常见误区
??= 只能用于变量(左值),不能用于函数调用或计算结果:
- ✅ 正确:
$arr['key'] ??= 'val';、$obj->prop ??= 'val'; - ❌ 错误:
get_config()['timeout'] ??= 30;(报语法错误,因左侧不是可赋值变量) - ❌ 错误:
($a + $b) ??= 100;同样非法
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











