PHP 不允许 null 作为数组键,$arr[null] 会静默转为空字符串 '';var_dump 显示键为 string(0) "",array_keys 返回 [''],isset($arr[null]) 为 true,array_key_exists(null, $arr) 为 false。

PHP 中数组下标为 null 的真实含义
PHP 不允许真正用 null 作为数组键(key),但当你写 $arr[null] = 'x',PHP 会**静默转换**:把 null 转成空字符串 ''。这不是 bug,是 PHP 类型强制转换规则的一部分——null 转字符串就是 ''。
所以你看到的“下标为 null”,其实是 var_dump() 或调试器显示的键名是 '',但你写的是 null;它不会报错,也不会存成 null 键,更不会触发 Notice。
$arr[null] 实际存到哪了?怎么验证?
直接用 var_dump($arr) 查看结构,你会看到键是 string(0) "",不是 NULL。再用 array_keys($arr) 拿所有键,结果里是空字符串,不是 null。
-
isset($arr[null])返回true—— 因为它等价于isset($arr['']) -
array_key_exists(null, $arr)返回false—— 它不做强制转换,严格比对类型和值 -
key_exists(null, $arr)和array_key_exists()行为一致
结论:array_key_exists() 是唯一能区分“真 null 键”(实际不存在)和“被转成 '' 的键”的方式 —— 但你要先接受:PHP 根本不支持 null 键。
立即学习“PHP免费学习笔记(深入)”;
为什么有人觉得下标“变成 null”?常见误判场景
多数情况不是数组键真为 null,而是变量未初始化或函数返回 null 后直接当键用了:
- 从 JSON 解析来数据,某个字段缺失 →
$data['missing_field']是null→$arr[$data['missing_field']] = 1就等于$arr[''] = 1 - 函数返回值没校验:
$key = some_config_func(); $arr[$key] = 'value';,而some_config_func()有时返回null -
foreach ($arr as $k => $v)中,如果$k是null,说明源数组本身就有个''键,只是你没看清
用 var_export($arr, true) 替代 print_r(),能更清楚看到键的原始类型和引号,避免误读。
安全处理潜在 null 键的推荐写法
不要依赖自动转换,主动拦截或标准化:
- 写入前判断:
$key = $raw_key ?? ''; $key = is_scalar($key) ? (string)$key : ''; - 用
array_key_exists()替代isset()做存在性检查,尤其当业务逻辑要求“空字符串”和“未定义”必须区分时 - 如果必须用非标量作键(比如对象 ID),统一转成字符串 ID:
$key = $obj->id ?? 'unknown';,而不是直接用$obj或null - 开启
error_reporting(E_ALL)并留意Notice: Undefined index—— 这类提示往往暴露了上游传了null却没处理
最易被忽略的一点:JSON decode 默认把缺失字段转成 null,但 PHP 数组键不接受 null,这个转换发生在赋值瞬间,没有任何错误提示,查 bug 时容易绕远路。











