ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

三步完成 Rector PHP 8.4 适配:[\Override] 批量添加与废弃 API 自动重构实操

三步完成 Rector PHP 8.4 适配:[\Override] 批量添加与废弃 API 自动重构实操 三步完成 Rector PHP 8.4 适配#[\Override] 批量添加与废弃 API 自动重构实操【免费下载链接】rectorInstant Upgrades and Automated Refactoring of any PHP 5.3 code项目地址: https://gitcode.com/GitHub_Trending/re/rector项目升到 PHP 8.4 后报错日志刷出一串 E_DEPRECATED隐式可空参数、round() 常量、str_getcsv 缺 escape 参数外加两百多个重写方法要回填 #[\Override]。这套 Rector PHP 8.4 适配流程三步跑完安装、dry-run 预览、执行验证。工具定位Rector 为什么能干这活Rector 是一个面向 PHP 5.3 代码的自动重构工具。它不走文本替换先把文件解析成 AST按规则逐节点改写再打印回源码。所以哪些方法重写了父类这类依赖继承关系和类型推断的判断它能基于继承链算出来而不是靠正则猜。规则集按 PHP 版本拆分维护单条规则可以单独 skip也能自己扩展。上手三步安装、配置、预览后执行第一步两条命令装好并生成 rector.phpcomposer require rector/rector --dev vendor/bin/rector init第一条把 Rector 装进开发依赖第二条在项目根目录生成 rector.php不用手写配置文件。第二步rector.php 只改两行生成的模板里真正决定行为的是两处return RectorConfig::configure() -withPaths([__DIR__ . /src]) -withPreparedSets(php84: true, codeQuality: true);withPaths 圈定扫描范围把要重构的目录都列进去。withPreparedSets 里的 php84: true 是关键开关加载 config/set/php84.php 内置的八条规则codeQuality 是附加的代码质量集本次升级用不到可以去掉。第三步dry-run 先跑一遍确认后再正式执行vendor/bin/rector process --dry-run vendor/bin/rector process先执行第一条预览命令它只打印 diff 不落盘。确认变更文件清单在预期内典型结尾是[OK] Rector is done! 35 files would have changed (dry-run)没问题再跑第二条真正应用修改。执行完跑一遍单测再在 8.4 环境 lint 一遍确认没有残留 E_DEPRECATED。特性转换对照表哪条规则管哪件事PHP 8.4 变更点对应规则转换前 → 转换后隐式可空参数废弃默认 null 未加 ?ExplicitNullableParamTypeRectorstring $param null→?string $param nullround() 改用 RoundingMode 枚举RoundingModeEnumRectorround(1.5, 0, PHP_ROUND_HALF_UP)→round(1.5, 0, RoundingMode::HalfAwayFromZero)CSV 函数要求显式 escape 参数AddEscapeArgumentRectorstr_getcsv($s, separator: ,, enclosure: )→ 补escape: \\new 表达式支持一级 callableNewMethodCallWithoutParenthesesRectornew ArrayObject()(...)→new ArrayObject(...)foreach 手动查找可换成 array_findForeachToArrayFindRector单元素查找的 foreach 循环 →array_find()重写方法批量回填 #[\Override]AddOverrideAttributeToOverriddenMethodsRector见下方 diff前五行规则源码都在 rules/Php84/ 目录下触发条件可以对着源码核对。#[\Override] 这条规则实际位于 AddOverrideAttributeToOverriddenMethodsRector.php它沿继承链识别重写方法在子类方法上补属性- public function getData() #[\Override] public function getData() { return parent::getData(); }两个常见认知偏差顺带说明PHP 8.4 没有引入数组泛型语法arrayint之类规则集里也没有对应规则遇到这类说法可以略过readonly 类的继承限制属于 8.2 的运行时行为不在 8.4 改造范围内。踩坑与进阶四类常见问题怎么处理预览扫到不该动的目录→ 用 withSkip 排除路径也支持按规则类 文件粒度排除比如 #[\Override] 规则不碰遗留代码-withSkip([ __DIR__ . /src/Legacy, AddOverrideAttributeToOverriddenMethodsRector::class [ __DIR__ . /src/Legacy/OldClass.php, ], ])内置规则覆盖不了自有场景→ 继承 AbstractRector 写规则类实现 getNodeTypes() 和 refactor()再用-withRules([...])注册可以直接抄 rules/Php84/ 里任意一条的文件结构当骨架。执行完还有告警→ 把 dry-run 的变更清单和告警文件对一遍清单里有但没改的看规则里的 guard 条件为什么拦了清单里没有的说明缺规则回到上一条自己写。想让检查长期生效→ CI 里加一步vendor/bin/rector process --dry-run出现未落盘 diff 就让流水线失败新代码不会再带着触发 8.4 规则的老问题合进来。收尾三步流程就是装、预览、执行验证剩下是规则级的微调。后续把 Rector 挂进合并检查环节并跟它的版本发布说明走——每个新 PHP 版本的规则集都会随版本直接给出。【免费下载链接】rectorInstant Upgrades and Automated Refactoring of any PHP 5.3 code项目地址: https://gitcode.com/GitHub_Trending/re/rector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表