PHP 5.4 引入空合并运算符(??),用于安全提供默认值,仅在变量未定义或为 null 时返回右侧值,支持链式调用,但不能替代所有 isset() 场景。

PHP 5.4 引入了 空合并运算符(??),它专门用于替代「先判断变量是否已设置且不为 null,再取值」的三元写法,比传统三元运算符更简洁、安全,也比 isset() 更直观。
用 ?? 替代 isset($a) ? $a : $b
这是最常见场景:给变量提供默认值。
- PHP 5.3 及之前只能写:
$name = isset($_GET['name']) ? $_GET['name'] : 'guest'; - PHP 5.4+ 推荐写:
$name = $_GET['name'] ?? 'guest';
注意:?? 仅检查变量是否存在且不为 null,不会触发 Notice;而直接访问未定义数组键(如 $_GET['name'])在 PHP 5.4+ 中本身会报 Notice,但 ?? 左侧表达式是“容错执行”的——即使键不存在,也不会报错。
?? 支持链式调用,避免多层 isset
处理嵌套数组或对象属性时优势明显:
立即学习“PHP免费学习笔记(深入)”;
- 传统写法:
$city = isset($user['profile']['address']['city']) ? $user['profile']['address']['city'] : 'unknown'; - 用
??:$city = $user['profile']['address']['city'] ?? 'unknown'; - 甚至可链式默认:
$city = $user['profile']['address']['city'] ?? $user['address']['city'] ?? 'unknown';
与三元运算符 ?: 的区别要分清
?? 和短三元 ?: 行为不同:
-
$x ?: $y:当$x为 falsy(如0、''、false、null)时返回$y -
$x ?? $y:仅当$x未定义或严格等于null时返回$y
例如:$count = 0; echo $count ?: 'no'; // 输出 ''(空字符串),因为 0 是 falsy)echo $count ?? 'no'; // 输出 0,因为 $count 已定义且不为 null
不能完全替代所有 isset() 场景
?? 仅适用于「取值并设默认」;以下情况仍需 isset():
- 只判断存在性,不取值:
if (isset($_POST['submit'])) { ... } - 同时检查多个变量:
if (isset($a, $b, $c)) - 配合
unset()或需要明确区分null和未定义
此时 ?? 无法替代,强行用会语法错误或逻辑错位。



















