PHP 7.0+ 应优先使用空合并运算符 ?? 设置默认值,它仅在左侧为 null 或未定义时取右侧值,避免将 0、false、'' 等假值误判;而三元运算符 ?: 基于布尔判断,会错误替换假值。

PHP 7.0 中设置默认值,不推荐继续用三元运算符(?:)做“存在性判断”,而应优先使用 空合并运算符 ??——它是 PHP 7.0 引入的专用语法,语义更准确、写法更简洁、行为更安全。
✅ 推荐方式:用 ?? 设置默认值(PHP 7.0+)
它只在左侧值为 null 或未定义时,才取右侧默认值,不会把 0、false、'' 等假值误判为“需要替换”:
$value = $array['key'] ?? 'default';
$userName = $_GET['name'] ?? '游客';
$host = getenv('DB_HOST') ?? 'localhost';支持链式嵌套,适合多维数组:
$city = $user['address']['city'] ?? '未知城市';
⚠️ 注意:
$array['key'] ?? 'default'不会触发Notice: Undefined index,比isset($array['key']) ? $array['key'] : 'default'更干净。立即学习“PHP免费学习笔记(深入)”;
⚠️ 三元运算符 ?: 在 PHP 7.0 中仍可用,但要小心语义偏差
?: 是“布尔真值判断”,等价于 $a ? $a : $b。它会对 0、''、false、[] 等所有“falsy”值触发默认值:
$score = 0; $name = $score ?: '暂无评分'; // ❌ 结果是 '暂无评分' —— 0 被当成 false!
如果你确实想保留 0 或空字符串,就别用 ?:,改用 ??:
$score = 0; $name = $score ?? '暂无评分'; // ✅ 结果是 0
? 兼容老写法?仅当必须支持 PHP < 7.0 时才用三元 + isset()
$value = isset($array['key']) ? $array['key'] : 'default';
但这种写法冗长、易出错(尤其嵌套深时),且无法避免多次访问数组引发的 notice(除非配合 @ 抑制,不推荐)。
? 小技巧:函数参数里设默认值,也建议用 ?? 做运行时兜底
PHP 函数参数本身不支持动态表达式作默认值(如不能写 function foo($id = $_GET['id'])),所以常用 ?? 在函数体内补救:
function getUser($id = null) {
$id = $id ?? $_GET['id'] ?? 1; // 先用传入值,再 fallback 到 GET,最后保底 1
return findUserById($id);
}不复杂但容易忽略



















