PHP 7.0–8.2中空数组语法无演变,[]与array()始终等效;差异在于语义、类型约束及工具链检查——类属性必须用[]配合类型声明,?array表示可为空契约而非初始化,风险聚焦于动态赋值、类型错配与非安全访问。

PHP 7.0 到 8.2 定义空数组的语法本身没有演变——[] 和 array() 在整个区间内始终合法、等效、无性能差异。真正发生变化的是围绕空数组的使用约束、类型系统要求和工具链检查能力。选对写法不难,难在让空数组“安全地参与后续逻辑”。
基础写法:[] 与 array() 的定位已明确
两者功能完全一致,区别仅在于语义和上下文适配:
-
[] 是现代项目的默认选择:自 PHP 5.4 起支持,简洁、嵌套直观(如
[['a'], []]),与 JSON/JS 风格统一,IDE 和静态分析更友好; - array() 是兼容性兜底方案:适用于需支持 PHP 5.3 或更旧环境的老系统,文档中虽在 8.2 标为“不推荐”,但未废弃、仍可运行;
- 不要混用:同一项目应统一风格,避免
$a = [];和$b = array();并存,影响可维护性。
类属性中必须用 [] 带类型声明
PHP 7.4+ 引入属性类型,这是提升代码健壮性的关键升级:
- 只能写
private array $items = [];,array()在此处会报语法错误; - 支持默认值初始化,如
public array $config = ['debug' => false];; - 不带类型声明的
private $items = [];虽能运行,但在 PHP 8.3+ 中可能触发警告,且丧失 IDE 自动补全和类型校验能力。
?array 不是创建空数组,而是表达“可为空”契约
这是最常被误解的点:?array 是类型提示,不是初始化语法:
- 函数参数写
function process(?array $data),表示允许传null、[]或完整数组,不会触发 TypeError; - 若写
function process(array $data)却传null,PHP 8.0+ 直接报致命错误; - 函数内部仍需主动初始化容器,如
$result = [];,?array 只放宽输入/输出边界,不替代实际数组构造。
自动化检查要盯住上下文,而非空数组本身
单纯检测是否用了 [] 没意义。工具链应聚焦三类真实风险:
-
动态属性赋值:如
$obj->data = [];,但类中未声明public array $data→ PHP 8.2 报 Fatal error; -
类型契约错配:声明返回
array却返回null或'',或参数要求array|string却传0; -
非安全访问:如
$config['db']['host']前未做$config['db'] ?? []防御 → PHP 8.1+ 报 “Trying to access array offset on value of type null”。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











