PHP 7.3 中 JSON 解析需区分 null 与空数组语义,推荐用 ?? 操作符或封装 is_array 判断的安全函数(如 getArray)将 null/非法值转为默认空数组,避免 (array) 强转导致多字节字符串误拆。

PHP 7.3 中处理 JSON 解析时的空值(如 null、空字符串、空数组)需特别注意多字节字符串(UTF-8)环境下的行为。定义空数组本身不是问题,关键在于如何让 JSON 解析后对“空值”保持语义一致,尤其当字段可能为 null 或空字符串但业务上需转为默认空数组时。
明确 JSON 输入中 null 与空数组的区别
JSON 原生支持 null 和 [],二者语义不同:
– "items": null 表示该字段未提供或显式置空;
– "items": [] 表示提供了字段且其值为空集合。
PHP 的 json_decode($json, true) 会分别转为 null 和 [],不会自动归一化。
用 null 合并操作符(??)安全转换为默认空数组
推荐在解码后按需转换,避免提前污染原始结构:
- 若期望字段始终是数组(即使 JSON 中为
null),用$data['items'] ?? [] - 若字段可能为
null或字符串(如误传的""),可组合判断:$items = is_array($data['items'] ?? null) ? $data['items'] : [];
- 不建议直接用
(array)$data['items']——它会把null转成空数组,但也把字符串"abc"转成['a','b','c'](因多字节字符串被拆成 Unicode 码点数组)
使用 json_decode 的 flags 参数预处理(PHP 7.3+)
PHP 7.3 支持 JSON_THROW_ON_ERROR,但不改变 null 解析逻辑。真正有用的是结合类型校验:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 先解码:
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); - 再统一规范关键字段:
$items = array_key_exists('items', $data) && is_array($data['items']) ? $data['items'] : []; - 注意:多字节字符串不影响数组结构解析,但若 JSON 中含非法 UTF-8 字节,
json_decode会返回false,需前置检测:if (!mb_check_encoding($json, 'UTF-8')) { /* 处理编码错误 */ }
封装可复用的空数组安全访问函数
适合项目中高频使用的场景:
立即学习“PHP免费学习笔记(深入)”;
-
示例函数:
function getArray($data, $key, $default = []) {<br> if (!is_array($data) || !array_key_exists($key, $data)) return $default;<br> return is_array($data[$key]) ? $data[$key] : $default;<br>} - 调用:
$items = getArray($data, 'items'); - 该函数不依赖 mbstring 扩展,兼容 PHP 7.3 默认配置,且明确排除字符串、数字等非数组类型


















