PHP 8.2 中定义空数组([] 或 array())本身合法,报错实为类型契约或上下文使用不合规所致:如参数需 ?array 却传 null、DNF 类型误用 [] 代替 array、未声明属性赋值空数组触发动态属性弃用警告,或 JSON 输出因 JSON_FORCE_OBJECT 导致空数组被转为 {}。

PHP 8.2 本身不会因为「定义空数组」而报错——array() 或 [] 在任何 PHP 版本中都是合法语法。你遇到的“报错”,实际是类型系统在运行时或静态检查阶段,对空数组所在上下文的使用方式提出了更严格的契约要求。尤其在接口实现、参数传递、返回值声明等位置,空数组常因类型不匹配、隐式转换或框架行为变化触发 TypeError 或 must be compatible with 类错误。
一、接口方法参数类型与空数组传入冲突
常见于控制器或服务类实现某个接口时,接口声明了联合类型(如 string[]|null),但实现类方法签名未对齐:
- 接口写的是:
public function handle(array $items): void; - 调用方却传了
null,而你没做判空处理 → PHP 8.2 直接抛TypeError: Argument #1 ($items) must be of type array, null given - 修复方式:改用可空数组类型
?array,或在调用前兜底:$items ?? [] - 注意:不要写
array|null(PHP 8.0+ 已弃用该写法),必须用?array
二、析取范式(DNF)类型中误用空数组作为值
PHP 8.2 支持 (A & B) | C 这类类型,但空数组本身不是类型,不能直接参与 DNF 声明。例如以下写法会解析失败:
- ❌ 错误:
function foo((JsonSerializable & Countable) | [])——[]不是合法类型名 - ✅ 正确:
function foo((JsonSerializable & Countable) | array)或更精确地function foo((JsonSerializable & Countable) | array{})(空形状数组) - 若想允许“空数组或某对象”,应写成:
array{} | (JsonSerializable & Countable)
三、框架模型/DTO 中动态属性 + 空数组赋值触发弃用警告
ThinkPHP、Laravel 等框架中,若 DTO 类未声明属性,又执行类似 $dto->tags = [],PHP 8.2 会报:
立即学习“PHP免费学习笔记(深入)”;
Deprecated: Creation of dynamic property DTO::$tags is deprecated- 即使
$tags是空数组,只要属性未提前声明,就属于“动态写入” - 修复:显式声明属性,如
public array $tags = [];,或加注解#[\AllowDynamicProperties] - 别依赖
stdClass继承来绕过——它掩盖问题,且不兼容强类型分析
四、JSON 输出时空数组被转成 null 或 {} 引发前端类型误判
这不是定义报错,但常被误认为“空数组出问题”。典型表现:
- 后端返回
"data": null,但代码里明明写了$data = [];→ 实际是变量被覆盖为null,或json_encode()前经过了非法转换(如(array) $obj失败) - 用了
JSON_FORCE_OBJECT→ 空数组变成{},前端Array.isArray()返回false - 排查:用
var_dump(gettype($data), $data);确认是否真为array(0) { },再检查是否误加了强制对象 flag



















