rector 默认不转换 [] 与 array() 写法,因其在 php 5.4+ 完全等价且无语义差异;需显式启用 arraytoshortarrayrector 规则才能将 array() 替换为 [],且会跳过含引用、常量键等不安全场景。

PHP 7.2 的大括号写法(即 [] 数组语法)本身是合法且推荐的,但 Rector 不会自动把它“降级”或“升级”——它只在你明确配置了版本迁移规则时才介入。如果你发现项目里还混着 array() 写法,想统一为 [],Rector 能做;但若只是 PHP 7.2 环境下用 [],Rector 默认不干预。
为什么 Rector 默认不碰 [] 写法
Rector 的设计原则是「只改有语义差异或兼容性风险的部分」。[] 和 array() 在 PHP 5.4+ 完全等价,没有运行时区别,也不影响类型推导或 AST 结构。所以除非你主动启用相关规则,Rector 不会把 array() 替换成 [],也不会反过来。
-
array()→[]属于「代码风格优化」,不是版本兼容必需项 - Rector 的
SetList::CODE_QUALITY默认不包含该转换,需显式启用 - PHP 7.2 本身完全支持
[],不存在语法报错或解析失败问题
ArrayToShortArrayRector 规则的实际效果
这个规则才是真正负责把 array() 换成 [] 的核心规则。但它不会无差别替换——它跳过有特殊结构的数组,比如含引用、含常量键、或嵌套太深的场景,避免破坏逻辑。
- 安全替换:
$arr = array(1, 2, 3);→$arr = [1, 2, 3]; - 跳过不换:
$arr = array('key' => $value);(带字符串键,保留原样) - 跳过不换:
$arr = array(&$ref);(含引用,不转,防止语义变更) - 注意:它不处理
array(...$args)这类展开用法,那是另一套规则(DowngradeArraySpreadUsageRector)管的
配置 ArrayToShortArrayRector 的正确姿势
别直接往 rector.php 里硬塞规则类名,要确保加载顺序和依赖正确。尤其在 PHP 7.2 项目中,得避开那些只适配 PHP 8.x 的规则集干扰。
- 必须用
RectorCodeQualityRectorArray_ArrayToShortArrayRector::class全路径,不能简写 - 不要和
SetList::PHP_74或更高版本规则混用,否则可能触发不兼容检查 - 推荐单独启用,而不是靠
withPreparedSets(codeQuality: true)——因为后者默认不开这个规则 - 加
--dry-run预览:vendor/bin/rector process src/ --rules="Rector\CodeQuality\Rector\Array_\ArrayToShortArrayRector" --dry-run
容易被忽略的边界情况
很多人以为只要开了规则就万事大吉,结果上线后 CI 报错。真正麻烦的是那些「看起来像数组、实则不是」的写法,Rector 会跳过,但人眼容易漏。
-
define('CONFIG', array('host' => 'localhost'));—— define 第二个参数不能是数组(PHP 7.2+ 仍报错),Rector 不动它,但你要手动改成字符串或常量 -
function foo(array $a = array()) { }—— 默认参数中的array()不会被转,因涉及函数签名,需用ParamTypeDeclarationRector配合处理 -
new SplFixedArray(array(1,2))—— 构造函数参数是array(),但SplFixedArray不接受[],Rector 识别后会跳过
这些点不写进配置文件,也不出现在 --dry-run 报告里,只有跑测试或上线时才暴露。所以重构后务必 grep 全局 array(,人工扫一遍漏网之鱼。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











