php 7 引入的 `??` 是空合并运算符,用于安全获取变量值:当左侧操作数存在且不为 `null` 时返回其值,否则返回右侧默认值,兼具 `isset()` 和空值判断逻辑,比嵌套三元运算更简洁高效。
在 PHP 开发中,经常需要为可能未定义或为 null 的变量提供默认值。传统方式常依赖 isset() 或 empty() 配合三元运算符,例如:
$username = isset($_GET['username']) ? $_GET['username'] : 'guest'; // 或更冗长的写法: $username = !empty($_GET['username']) ? $_GET['username'] : 'guest';
这类写法不仅重复访问数组键(存在潜在性能开销和 Notice 风险),还易出错——比如 empty() 会将 0、'0'、false 等“falsy 值”误判为需兜底,而实际业务中这些值可能是合法输入。
PHP 7 起引入的 空合并运算符(Null Coalescing Operator) ?? 正是为此优化而生。它的语义非常明确:
✅ 检查左侧表达式是否已声明且不为 null(等价于 isset($var) && $var !== null);
❌ 若不满足,则直接返回右侧表达式结果,不执行左侧表达式二次求值(安全、高效、无 Notice)。
语法形式为:
$result = $expr1 ?? $expr2;
等价于:
立即学习“PHP免费学习笔记(深入)”;
$result = isset($expr1) && $expr1 !== null ? $expr1 : $expr2;
// 从 $_GET 安全取值,避免未定义索引警告 $user = $_GET['user'] ?? 'anonymous'; // 若 $_GET['user'] 不存在或为 null,返回 'anonymous' // 链式调用(PHP 7.4+ 支持多级空合并) $avatar = $_SESSION['user']['profile']['avatar'] ?? $_ENV['DEFAULT_AVATAR'] ?? '/img/default.png'; // 变量自身兜底(常用于函数参数初始化) $limit = $limit ?? 10;
?? 是 PHP 7 标志性语法糖之一,以极简写法替代了高频的 isset() 判断场景,在可读性、安全性与性能上均优于传统方案。推荐在所有需要“存在性 + 非空”默认值赋值的场景中优先使用
它,同时牢记其与 empty() 的本质区别,避免语义误用。