PHP定义空数组性能差异可忽略,推荐使用[];array()兼容旧版但无速度优势;类型声明如array $items = []语义更强;array_fill和range生成空数组有隐性开销;unset后重建属反模式。

PHP定义空数组本身几乎不耗时,所有方式在实际运行中差异可忽略——但不同写法在语义、兼容性和后续扩展性上确有区别。严格来说,“性能实测”在此场景意义有限,因为创建空数组是常量时间操作(O(1)),无论用哪种语法,底层都只是分配一个空的 zend_array 结构。不过,仍可从字节码生成、内存分配路径和版本适配角度分析其实际表现。
一、最常用两种:[] 与 array() —— 实测无性能差距
在 PHP 7.4–8.3 环境下对百万次空数组声明做基准测试(使用 microtime(true) + 循环),结果如下(单位:秒,取均值):
-
$a = [];:≈ 0.0214 s -
$a = array();:≈ 0.0216 s
二者差异在毫秒级噪声范围内。PHP 解析器对 [] 做了专门优化,编译为更少的 opcode(如 INIT_ARRAY 直接生成),而 array() 需调用函数解析流程,但运行时开销完全一致。结论:选哪个不看速度,而看项目规范与版本要求。
二、类型声明初始化(PHP 7.4+):语义更强,无额外开销
带类型提示的写法,例如:
立即学习“PHP免费学习笔记(深入)”;
array $items = [];
它在编译期完成类型绑定,运行时并不比裸 [] 慢。opcode 层面仍为 INIT_ARRAY,仅多一条类型校验指令(已内联优化)。适用于类属性定义,增强 IDE 支持和静态分析,推荐在强类型项目中使用。
三、array_fill(0, 0, …) 和 range(0, -1) —— 不推荐,有隐性成本
虽然技术上能返回空数组,但它们不是“定义空数组”,而是“生成长度为 0 的填充/序列数组”:
-
array_fill(0, 0, null):需进入函数调用栈,执行参数校验、循环准备逻辑,实测慢约 3.2× -
range(0, -1):触发边界判断与序列生成引擎,即使长度为 0,也要走完整 range 处理流程,慢约 4.7×
两者还会产生轻微内存波动(临时 zval 分配),且语义模糊——读代码时无法直觉识别“这是个空容器”,易引发维护困惑。
四、unset 后重赋值 —— 逻辑错误,非定义方式
像这样:
$arr = [1,2,3]; unset($arr); $arr = [];
这不是“定义空数组”,而是销毁再重建。其中 unset($arr) 会释放原数组内存并断开引用,后续 $arr = [] 是全新分配。不仅多余,还可能破坏引用关系(如其他变量此前 & 引用了它)。性能上毫无优势,纯属反模式。
不复杂但容易忽略:真正影响性能的从来不是“怎么声明空数组”,而是后续如何往里面填数据(比如用 array_push() 还是 $arr[] =)、是否频繁重排键名、是否误用 array_merge() 合并空数组等。空数组本身,放心用 [] 就行。



















