PHP 5.6 中需用 === null 或 isset() 显式判断 null,避免 ?: 将 0、false 等 falsy 值误判为 null;推荐组合 isset($var) && $var !== null 或封装 null_coalesce() 函数模拟 ?? 行为。

在 PHP 5.6 中,没有 ??(空合并运算符),该运算符是 PHP 7.0 才引入的。因此,若要在 PHP 5.6 中安全、准确地判断一个变量是否为 null 并提供默认值,不能依赖 ?: 或 ?? 的简写逻辑,而需明确区分“是否为 null”和“是否为 falsy 值”。
✅ 正确判断 null 的方式(PHP 5.6)
使用 === null 严格比较
$value = $input === null ? '默认值' : $input;
- ✅ 精确匹配
null类型和值,不把0、false、''、[]当作null - ⚠️ 若
$input未定义(如$undefined),会触发Notice: Undefined variable
→ 需先确保变量已声明,或配合isset()使用
先用 isset() 判断存在性,再处理 null
$value = isset($input) ? $input : '默认值';
- ✅ 安全:
isset()对未定义变量或null都返回false - ❗但注意:
isset($var)为false时,可能是 未定义,也可能是 值为null,二者结果相同;它无法单独区分“键存在但值为 null”和“键根本不存在”
处理数组键或对象属性中的 null
$value = isset($arr['key']) && $arr['key'] !== null ? $arr['key'] : '默认值'; // 或更严谨(兼容 null 和缺失键): $value = (isset($arr['key']) && $arr['key'] !== null) ? $arr['key'] : '默认值';
- 因为
isset($arr['missing'])是false,$arr['missing'] === null会报 Notice,所以必须先isset()再比较
❌ 不推荐的方式(PHP 5.6 中易出错)
错误:用 ?: 判断 null
$value = $input ?: '默认值'; // ❌
-
?:是“三元简写”,等价于$input ? $input : '默认值' - 它判断的是 falsy 值:
null、false、0、''、'0'、[]等都会触发默认值
→ 若$input = 0(合法业务值),也会被误替换成默认值,逻辑错误
错误:用 == null 或 !$input
$value = ($input == null) ? '默认值' : $input; // ❌ 类型松散,0 == null 为 true $value = !$input ? '默认值' : $input; // ❌ 同样混淆 0/false/''/null
✅ 实用组合技巧(PHP 5.6 兼容)
模拟 ?? 行为(仅对 null/未定义兜底)
function null_coalesce($value, $default) {
return $value === null || !isset($value) ? $default : $value;
}
// 使用:
$username = null_coalesce($_GET['user'], '游客');- 显式封装,语义清晰,避免重复写长三元表达式
处理 $_GET/$_POST 参数(最常见场景)
$id = isset($_GET['id']) && $_GET['id'] !== '' ? (int)$_GET['id'] : 0; // 或如果只接受非 null 数值: $id = isset($_GET['id']) && $_GET['id'] !== null ? (int)$_GET['id'] : 0;
不复杂但容易忽略:PHP 5.6 下,null 是类型安全的独立值,不是“空”的同义词。想精准兜底,就得绕过 ?: 的 falsy 陷阱,用 === null 或 isset() + 显式判断。



















