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() 对二者都视为“空值”,并不代表它们等价。
PHP经典实例(第2版)能够为您节省宝贵的Web开发时间。有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。《PHP经典实例(第2版)》将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到各种编程问题的解决方案,《PHP经典实例(第2版)》中内容涵盖了:表单处理;Session管理;数据库交互;使用We
- 要确认是否为 真正未设置或被显式置为 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表示“不传”,内部再初始化为[];若默认写成[],就失去了“是否主动传参”的判断依据
安全使用的建议写法
兼顾可读性与健壮性:
- 接收可能为
null的变量并转为数组时,推荐:$items = $input === null ? [] : (array)$input; - 遍历前防御性检查:
if (is_array($data) && !empty($data)) { foreach ($data as ...) } - 调试时善用
gettype()+var_export(),而非只看print_r()表面输出 - 在类型声明严格的环境中(PHP 7.4+),可用联合类型明确标注:
function process(?array $list): void,其中?array表示array|null










