NULL与空数组本质不同:null是null类型,表示无值;空数组是Array类型,长度为0。判断需用is_null()和is_array()+count(),不可仅依赖empty()。

在 php 中,null 和 空数组([] 或 array()) 是两种完全不同的数据类型和语义状态,不能混为一谈。理解它们的本质差异,对避免逻辑错误、提升代码健壮性至关重要。
类型与值本质不同
null 是一个单独的标量类型(NULL),表示“无值”或“未定义”,它既不是数组,也不包含任何元素;而空数组是 array 类型,属于复合类型,其值是一个长度为 0 的合法数组结构。
-
var_dump(null);→NULL,类型为NULL -
var_dump([]);→array(0) { },类型为array -
is_null(null)返回true;is_null([])返回false -
is_array(null)返回false;is_array([])返回true
判断方式不能互相替代
用错判断函数会导致误判。例如:empty(null) 和 empty([]) 都返回 true,但这只是因为 empty() 对二者都视为“空值”,并不代表它们等价。
- 要确认是否为 真正未设置或被显式置为 null,应优先用
is_null($var)或严格比较$var === null - 要确认是否为 合法但为空的数组,应结合类型与长度:
is_array($var) && count($var) === 0,或更简洁地用is_array($var) && !$var(因空数组在布尔上下文中为false,但需确保变量确定是数组) - 避免仅依赖
empty()区分二者——它还会把0、"0"、false等也判为 true,语义太宽泛
实际场景中的典型误用
常见于函数返回值处理或配置读取:
立即学习“PHP免费学习笔记(深入)”;
- 数据库查询未命中时返回
null,而字段允许为空时可能存的是[](如 json 字段解析结果)。若统一用foreach($data as ...),null会触发警告,[]则安全执行零次 - API 接口约定“缺失字段为
null,存在但无内容为[]”。此时用isset($arr['items'])可区分:对null返回false,对[]返回true - 函数参数默认值设为
null表示“不传”,内部再初始化为[];若默认写成[],就失去了“是否主动传参”的判断依据
安全使用的建议写法
兼顾可读性与健壮性: