PHP 5.4起官方推荐使用短数组语法[]替代array(),二者语义、执行结果、类型及性能完全一致,底层AST和opcode相同,支持嵌套与表达式,但不兼容PHP 5.3及更早版本。

PHP 5.4 开始支持短数组语法,也就是用 [] 替代 array() —— 这不是语法糖的“可选”,而是官方推荐且更轻量的写法,所有新项目应直接使用。
短数组语法怎么写?和 array() 完全等价吗?
写法就是把 array(1, 2, 3) 改成 [1, 2, 3],关联数组同理:['name' => 'Tom', 'age' => 25]。
它和 array() 在语义、执行结果、类型、性能上完全一致,底层 AST 和 opcode 都一样。PHP 解析器在词法分析阶段就直接把 [] 映射为数组构造指令,不存在运行时开销差异。
- 支持嵌套:
[1, ['a' => true], ['x', 'y']] - 支持表达式元素:
[$x + 1, func(), $obj->prop] - 不支持 PHP 5.3 及更早版本,报错:
Parse error: syntax error, unexpected '['
为什么不能在 PHP 5.3 环境里“模拟”短数组语法?
有人试图用函数封装(比如 arr(1,2,3))来“兼容”,但这是徒劳的:
立即学习“PHP免费学习笔记(深入)”;
- 函数调用返回的是新数组副本,无法用于引用赋值(
&$arr[0]会失败) - 无法用于静态变量初始化:
static $cache = array(1);合法,但static $cache = [1];在 5.3 是语法错误,根本过不了解析 - var_dump 输出中类型名仍是
array,但字面量本身是语法层级的变更,没法靠运行时补丁绕过
升级到短数组后要注意哪些隐性坑?
绝大多数情况无缝替换,但以下场景容易出问题:
- IDE 或静态分析工具(如 PHPStan、Psalm)若未设对 PHP 版本,可能误报“不支持的语法”
- 某些老旧的代码格式化工具(如早期版本 PHP-CS-Fixer)默认不识别
[],会强行转回array(),需确认配置中启用了array_syntax规则并设为short - 团队协作时,如果 .php_cs 或 php-cs-fixer.php 中没统一规则,会出现同一文件里
[]和array()混用,影响可读性 - 从 PHP 5.4 升到 7.4+ 后,
[]还能配合其他新特性用,比如解构赋值:[$a, $b] = $pair;—— 但这属于延伸用法,和短语法本身无关
真正要留心的,其实是那些“看起来像数组字面量但其实不是”的地方:比如 JSON 字符串里的 []、正则中的字符组 [a-z]、或者 shell 脚本里的数组声明——这些和 PHP 的短数组语法毫无关系,混淆它们会导致调试走偏。



















