PHP 5.4起支持[]替代array(),但PHP 5.3及更早版本不识别[]语法,会直接报Parse error;无法用函数模拟,因短数组是语法字面量,涉及引用、静态变量初始化等场景必须真实替换;推荐用tokenizer工具精准转换。
![php 5.4短数组语法[]:从旧版迁移的自动化替换脚本【方法】](https://img.php.cn/upload/article/001/503/042/178058316894282.jpg)
PHP 5.4 起支持 [] 替代 array(),语法简洁、语义一致、性能无差异。但若需降级兼容 PHP 5.3 或更早环境,必须将所有短数组语法完整转回 array() 形式——这不是风格选择,而是解析器层面的硬性要求:PHP 5.3 遇到 [ 会直接报 Parse error: syntax error, unexpected '[',脚本根本无法启动。
为什么不能靠函数“模拟”短数组?
有人尝试写个 arr() 函数来“兼容”,但这条路走不通:
- 函数返回的是新数组副本,不支持引用赋值(
&$arr[0]会失败) - 无法用于静态变量初始化:
static $cache = [1];在 PHP 5.3 是语法错误,连词法分析都过不去 -
var_dump显示类型仍是array,但[]是语法层级的字面量,运行时无法补丁
安全可靠的批量替换方法
推荐使用基于 PHP tokenizer 的专业工具,它能精准识别数组字面量,避开字符串、注释、正则表达式等误匹配区域:
- 开源脚本 PHP 5.4 Short Array Syntax Converter:利用内置
token_get_all()解析 AST,只操作真实数组结构,不碰其他代码 - 命令行一键转换整个项目:
find ./src -name "*.php" -exec php convert.php -w {} \; - 支持反向转换(
array()→[]),适合新项目统一风格
手动替换需注意的关键细节
若必须手动或正则处理,以下三点极易出错:
立即学习“PHP免费学习笔记(深入)”;
-
嵌套必须逐层展开:如
['a' => ['x' => 1]]要先转内层['x' => 1]为array('x' => 1),再转外层,否则括号配对错乱 -
类属性默认值要移出声明:PHP 5.3 不允许
public $cfg = [];,需改用构造函数中赋值 -
空数组不能省略括号:
array(无括号)会被解释为字符串,必须写成array()
迁移后验证要点
替换完成后别急着上线,重点检查这几处是否遗漏:
- 函数参数中的数组:
foo([1,2,3])→foo(array(1,2,3)) - 匿名函数返回值:
function() { return ['ok']; }→function() { return array('ok'); } - 常量定义(PHP 5.6+ 支持
const数组,但 5.3 不行,需改用define()或变量) - 运行
php -l对每个文件做语法检测,确认无unexpected '['报错



















