?? 只判断 null 或未定义,对 0、''、false 等 falsy 值原样返回;其逻辑等价于 isset($x) && $x !== null ? $x : $default,不等同于 empty() 或三元运算符 ?:。

不会。 ?? 只判断 null 或“未定义”,对 0、''、false 这类“falsy 但已定义且非 null”的值完全不干预,原样返回。
?? 的实际判断逻辑:只看 null 和未定义
它的行为等价于 isset($x) && $x !== null ? $x : $default,不是 empty(),也不是 $x ? $x : $default。
- 当
$x = 0→$x ?? 'default'返回0 - 当
$x = ''→ 返回'' - 当
$x = false→ 返回false - 当
$x = null或$x根本没声明 → 返回'default'
和 ?: 混用时最容易踩坑
写错成 ?: 就会误判 0:
-
$_GET['limit'] ?? 10:传?limit=0→ 正确返回0 -
$_GET['limit'] ?: 10:同样传?limit=0→ 返回10(因为0是 falsy) - 如果业务里分页参数允许为
0(比如“不限制”),用?:就直接兜底错了
链式 ?? 的典型误用场景
多层取值时,有人以为 ?? 能跳过空数组或空字符串,其实不能:
-
$user['profile']['country'] ?? 'CN'→ 若$user['profile']是''或[],PHP 仍会报Notice: Trying to access array offset on value of type string - 真正安全的写法是确保中间层级存在:
($user['profile'] ?? [])['country'] ?? 'CN' - 或者改用
??=预设结构:$user['profile'] ??= [];
最常被忽略的一点:?? 不解决“数组键存在但值为空字符串”的问题,它只管 null 和未定义。需要区分“缺失配置”和“显式设为空”时,得配合 array_key_exists() 或额外判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











