Rector 能自动将 PHP 7.4 或更早代码升级至 PHP 8.0 语法,但必须匹配真实运行环境、选用正确规则集(如组合 php74: true, php80: true)、显式配置路径与跳过项,并提前用 PHPStan 扫描类型隐患,否则会因弱类型遗留问题触发 TypeError。

Rector 能自动把 PHP 7.4 或更早的代码升级到 PHP 8.0 语法,但必须用对规则集、配对真实运行环境,且不能跳过类型校验环节。
怎么选对 php80 规则集
别直接抄 SetList::UP_TO_PHP_80 就跑。Rector 的规则集不是“兼容 PHP 8.0”就等于“能跑在你机器上”,它只负责加语法、改结构,不检查你底层是否支持。
- 先确认你目标环境的真实 PHP 版本:
php -v,如果 CI 或生产环境还是 PHP 7.4,硬上UP_TO_PHP_80会生成match表达式或属性提升(public function __construct(private string $name)),PHP 7.4 直接报错 -
UP_TO_PHP_80是“升到 8.0 可用”,不是“从 7.4 升级到 8.0”的完整路径——它不处理array()→[]这种基础替换,得额外加SetList::PHP_74或SetList::PHP_73 - 如果你是从 PHP 7.2 升级,建议组合使用:
->withPhpSets(php74: true, php80: true),而不是只开php80
rector.php 配置里最容易失效的三处
很多配置写了跟没写一样,是因为 Rector v1.0+ 的 API 已彻底重构,旧教程里的写法会静默跳过规则。
- 入口必须是
RectorConfig::configure(),不能写return static function (ContainerConfigurator $containerConfigurator): void { ... }—— 后者是 0.23 及以前版本的写法,现在会加载失败 -
->withPaths()必须显式列出所有要处理的目录,src不自动包含src/Controllers子目录;若用 Laravel,还得加上app/Http/Controllers -
->withSkip()里的路径必须和磁盘路径完全一致:macOS 下写src/Exceptions有效,Windows 下得写src\Exceptions,Rector 不做路径归一化
为什么 --dry-run 显示改了 127 处,实际只生效 3 处
这不是 Rector 抽风,是路径、过滤或规则前置条件没满足。
立即学习“PHP免费学习笔记(深入)”;
-
AddArrayReturnTypeRector只对已有完整 docblock 的函数生效,function foo() {}这种裸函数会被跳过 -
TypedPropertyFromStrictConstructorRector要求构造函数参数有明确类型 hint 或 docblock 注解,否则不触发属性提升 - 没开
declare(strict_types=1)的项目,Rector 加了类型声明也形同虚设——运行时不报错,但phpstan analyse或 CI 会立刻翻车
升级后跑出 TypeError 怎么办
这不是 Rector 改错了,是它把原来靠弱类型苟活的问题当场戳穿了。
- 典型场景:
AddVoidReturnTypeRector给函数加了: void,但某处写了return $this;—— PHP 8.1+ 拒绝执行 - 另一个高发点:
ClassPropertyAssignToConstructorPromotionRector把$this->name = $name;提升为private string $name,但调用处传的是$_GET['name'] ?? null,null 传给string类型参数,PHP 8.0+ 立刻 fatal - 解决办法:升级前先用
phpstan analyse --level max扫一遍类型隐患;或临时在withSkip()里排除高风险类,等人工补完类型再放开
最常被忽略的一点:Rector 的效果高度依赖你是否已启用严格类型。没开 strict_types=1,加再多类型声明也只是“看起来很美”。



















