PHP 5.4起[]成为合法且等价的短数组语法,语义、类型、性能与array()完全一致;此前版本仅支持array(),否则报解析错误。

PHP 5.4 之前:只有 array() 是唯一可靠方式
在 PHP 5.4 之前的版本(如 5.3、5.2 甚至更早),array() 是定义空数组的**唯一标准语法**。任何使用 [] 的写法都会导致解析错误——PHP 解释器根本不认识这种写法,直接报 Parse error: syntax error, unexpected '['。
这意味着:如果你维护一个需兼容 PHP 5.3 或更低环境的项目(例如某些老旧 CMS 或嵌入式系统),必须坚持用 $arr = array();,否则代码无法运行。
PHP 5.4 起:[] 成为合法且等价的短数组语法
PHP 5.4.0 正式引入了方括号 [] 作为 array() 的语法糖,这是语言层面的重大简化。从这一版开始:
-
$arr = [];和$arr = array();在语义、类型、行为上完全一致 - 空数组、索引数组、关联数组都支持该写法,例如:
["a", "b"]或["name" => "Tom"] - 性能无差异,底层均生成相同 zval 结构,无运行时开销
这个改动不是“新增功能”,而是**语法层面的等效替代**,目标是提升可读性与书写效率,尤其在嵌套数组或函数返回值中优势明显(如 return ["data" => [], "meta" => []];)。
立即学习“PHP免费学习笔记(深入)”;
PHP 7.1+:类型声明让空数组初始化更严谨
虽然 PHP 5.4 开放了 [],但真正让空数组定义“带约束”的是 PHP 7.1 引入的**类属性类型声明**和 PHP 7.4 的**属性类型语法强化**:
- PHP 7.1+ 支持在类中声明数组类型属性:
public array $items;(需配合构造函数赋值) - PHP 7.4+ 允许直接初始化:
private array $items = [];—— 这既是语法糖,也是类型保障 - 此时若写
private array $items = array();同样合法,但= [];更紧凑,且与参数类型提示(如function foo(array $data = []))风格统一
这类写法在启用严格模式(declare(strict_types=1);)或使用静态分析工具(PHPStan、Psalm)时,能提前捕获类型误用,属于“跨版本演进中的质量升级”。
不推荐的伪“空数组”写法
有些写法看似创建了空数组,实则存在类型或逻辑陷阱:
-
$arr = null;→ 变量是null,不是数组,后续$arr[] = 1会触发 notice -
$arr = array(null);→ 数组长度为 1,首个元素是null,empty($arr)返回false -
$arr = (array) null;→ 虽然结果是空数组,但属强制类型转换,语义模糊,易误导 -
$arr = new ArrayObject();→ 返回对象而非原生数组,不满足is_array($arr),多数内置函数(如array_merge)不接受
这些都不是真正的“空数组定义”,而是绕行方案,应避免在常规逻辑中使用。



















