isset()对null返回false,empty()对null也返回true;二者均非专用于判null,正确判null应使用$var === null或is_null($var)。

isset() 和 empty() 对 null 的行为差异
isset() 检查变量是否已声明且不为 null,遇到 null 直接返回 false;empty() 则把 null、0、''、false 等都当作“空”,也返回 true。两者都不是专为判断 null 设计的,但常被误用。
常见错误:用 empty($var) 判断变量是否为 null,结果 $var = 0 或 $var = '' 时也触发,逻辑出错。
- 想确认变量存在且不是
null→ 用isset($var) - 想确认变量明确等于
null→ 必须用$var === null - 想区分未定义、
null、空字符串、0等状态 → 避免empty(),改用显式比较
为什么不能只靠 is_null()
is_null() 能准确识别 null,但它对未定义变量会触发 Notice: Undefined variable。比如 is_null($undefined) 在严格模式下直接报错,而 isset() 和 === null 不会。
使用场景:仅在你**确定变量已声明**的前提下,is_null($var) 是安全的;否则优先用 $var === null(PHP 7+ 支持对未定义变量做严格比较,不会报错,但结果恒为 false)。
- 变量可能未定义 → 用
!isset($var) || $var === null表达“未设置或为 null” - 变量一定已声明 →
is_null($var)和$var === null效果等价,后者更直观 - 注意:
is_null(null)返回true,但is_null(NULL)(大写)也合法,PHP 不区分大小写常量
?? 和 ?: 运算符在 null 场景下的实际表现
??(空合并运算符)只在左侧为 null 或未定义时取右侧值;?:(三元简写)则对所有“falsy”值(包括 0、false、'')都触发。
例如:$x = $input ?? 'default' 中,$input = null → 取 'default';$input = 0 → 仍取 0。而 $x = $input ?: 'default' 遇到 0 也会取默认值,容易掩盖业务含义。
- 需要“仅当 null/未定义才兜底” → 无条件用
?? - 数组键存在但值为
null,$arr['key'] ?? 'n/a'正确;$arr['key'] ?: 'n/a'错误地把0当空处理 -
??支持链式:$a->b->c ?? 'fallback',中间任一环节为null或不存在都不报错
从类型安全角度处理 null —— PHP 7.1+ 的可空类型提示
函数参数或返回值声明为 ?string、?int 等,表示允许传入 null。这本身不改变运行时判断逻辑,但配合 IDE 和静态分析工具,能提前暴露潜在的 null 使用风险。
例如:function getName(?string $name): string { return $name ?? 'Anonymous'; },调用时传 null 合法,但若漏掉 ?? 处理直接拼接,PHP 8 会报 TypeError(因返回类型声明为 string)。
- 启用严格模式(
declare(strict_types=1);)后,类型声明才真正生效 - 可空类型不等于“可以忽略 null”,它只是把
null显式纳入契约,后续仍需判断或解包 - 对数组元素或对象属性,类型声明无效,必须靠运行时检查(如
isset($arr['key']) && $arr['key'] !== null)
最易被忽略的是:很多开发者以为 isset() 能代替 null 判断,其实它只回答“是否存在且非 null”,不回答“是不是 null”。真要确认是 null,=== null 是最直白、最可控的方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











