
Rector 如何帮你 3 步完成 PHP 8.4 自动重构从安装到验证的完整指南【免费下载链接】rectorInstant Upgrades and Automated Refactoring of any PHP 5.3 code项目地址: https://gitcode.com/GitHub_Trending/re/rector这篇文章带你用 Rector 完成一次真实的 PHP 8.4 升级。Rector 是一个 PHP 自动重构工具它基于 AST 分析代码能把隐式 nullable 参数、round() 取整常量、foreach 查找等写法批量改成新特性写法。读完这篇你会掌握它的安装、配置、dry-run 预览到正式应用的全流程并看清每条规则实际改了什么。为什么手动升级到 PHP 8.4 容易翻车如果你的项目还在 PHP 8.3 及以下升到 8.4 时通常会遇到这些问题改动点多一个中型项目里隐式 nullable 参数可能有几十上百处规则容易记错比如PHP_ROUND_HALF_UP该换成哪个枚举成员记错就是 bug改完难复核人工 diff 一遍代码既慢又容易漏Rector 的思路是把每个新特性写成独立规则逐条扫描 AST 后做精准替换。规则都放在 rules/Php84/ 目录下PHP 8.4 规则集的组装逻辑在 config/set/php84.php改了什么、为什么改打开源码就能对账。5 分钟装好 Rector 并生成配置用 Composer 一键安装在项目根目录执行composer require rector/rector --dev装完后可执行文件在vendor/bin/rector。写一份最小可用的 rector.php在项目根目录创建rector.php也可以用rector init生成骨架?php use Rector\Config\RectorConfig; return RectorConfig::configure() -withPaths([ __DIR__ . /src, ]) -withPhpSets(php84: true);这里注意两点withPaths只写你真正要改的目录避免误伤 vendorwithPhpSets(php84: true)是累计启用到 PHP 8.4 的规则即 8.0 到 8.4 的规则都会生效不需要逐版打开。该 API 定义在 src/Configuration/RectorConfigBuilder.php。先 dry-run 预览再正式应用转换用 dry-run 模式检查改动范围正式动代码前先跑预览vendor/bin/rector process --dry-run这一步只输出「将会被修改的文件和差异」不会写回磁盘。你扫一眼输出确认改动都符合预期再往下走。确认无误后执行正式转换vendor/bin/rector process这一步会把预览中的改动真正写入文件。建议跑完后把 git diff 再过一遍重点看类型声明相关的改动。Rector 对 PHP 8.4 代码的具体改法下面每个例子都来自对应规则源码里的真实用例你可以直接对照自己项目的效果。隐式 nullable 参数改为显式写法ExplicitNullableParamTypeRector 处理 PHP 8.4 开始废弃的隐式 nullable 参数- function foo(string $param null) {} function foo(?string $param null) {}因为 8.4 起这种写法会触发E_DEPRECATED补上?是必须动作。round() 取整常量替换为 RoundingMode 枚举RoundingModeEnumRector 把旧的PHP_ROUND_*常量换成新的RoundingMode枚举- round(1.5, 0, PHP_ROUND_HALF_UP); round(1.5, 0, RoundingMode::HalfAwayFromZero);新枚举在语义上更清晰也避免以后常量再次废弃。去掉 new 表达式外层多余的括号NewMethodCallWithoutParenthesesRector 利用 PHP 8.4 起(new Foo())-bar()中的括号变为可选- (new Request())-withMethod(GET)-withUri(/hello-world); new Request()-withMethod(GET)-withUri(/hello-world);纯风格优化去掉后调用链更干净行为完全不变。foreach 查找循环改写为 array_find()ForeachToArrayFindRector 识别「赋值 break」的经典查找循环- $found null; - foreach ($animals as $animal) { - if (str_starts_with($animal, c)) { - $found $animal; - break; - } - } $found array_find($animals, fn($animal) str_starts_with($animal, c));用 PHP 8.4 新增的array_find()替代 6 行循环意图一目了然。同族还有array_find_key、array_any、array_all对应规则都在 rules/Php84/Rector/Foreach_/ 目录。CSV 函数补上 escape 参数AddEscapeArgumentRector 会提醒并补全 CSV 函数缺少的escape参数- str_getcsv($string, separator: ,, enclosure: ); str_getcsv($string, separator: ,, enclosure: , escape: \\);因为 8.4 起不显式传escape会收到弃用警告补上默认值即可消除。另外说明一点如果你还想给重写方法批量加#[\Override]属性该特性属于 PHP 8.3对应规则 AddOverrideAttributeToOverriddenMethodsRector 位于 rules/Php83/。由于withPhpSets(php84: true)是累计启用它会一并生效不需要单独配置。进阶用 withSkip 收窄规则生效范围有些遗留代码不想让某条规则碰。在rector.php里加withSkipreturn RectorConfig::configure() -withPaths([ __DIR__ . /src, ]) -withPhpSets(php84: true) -withSkip([ // 排除某个目录 __DIR__ . /src/Legacy, // 某条规则只跳过个别文件 \Rector\Php84\Rector\Foreach_\ForeachToArrayFindRector::class [ __DIR__ . /src/Old/SearchService.php, ], ]);这一步的目的是「目录级 规则级」双层排除整目录不想动就排目录只有个别文件有风险就按规则精确排除。收尾验证结果并接入日常流程转换完成后做三件事跑一遍单元测试确认行为无回归用 PHP 8.4 环境启动项目确认控制台不再出现相关E_DEPRECATED检查git diff逐条确认改动都能对上本文列出的规则后续建议把vendor/bin/rector process --dry-run加进 CI一旦有新增代码偏离新风格立刻报警升级 Rector 版本后重新跑一遍 dry-run跟进后续 PHP 版本的适配规则有项目特有的转换需求时参考 README.md 中的自定义规则说明扩展自己的 Rector一句话收束把重复的语法迁移交给 Rector你只需要审阅 diff升级 PHP 版本就不再是体力活。【免费下载链接】rectorInstant Upgrades and Automated Refactoring of any PHP 5.3 code项目地址: https://gitcode.com/GitHub_Trending/re/rector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考