应通过 composer require rector/rector --dev 安装为开发依赖,不可全局安装;旧版本需先 composer remove rector/rector 再重装;php 8.2+ 项目可加 --with-all-dependencies 解决依赖冲突;必须配置 rector.php 启用规则才能升级 phpunit。

怎么用 Composer 安装 Rector
Rector 不是靠 phpunit 那种全局命令安装的,它得作为项目级依赖加进 composer.json —— 否则后续没法精准适配你当前的 PHPUnit 版本和代码结构。
直接运行:
composer require rector/rector --dev就行。别加
-g(全局),也别用 require-dev 以外的方式塞进去,否则 rector.php 配置和规则加载会出问题。
- 如果你项目里已有旧版 Rector(比如 v0.12),先
composer remove rector/rector再重装,避免规则冲突 - 某些 PHP 8.2+ 项目会因依赖冲突卡在
nikic/php-parser版本上,这时加--with-all-dependencies强制对齐 - 安装完检查
vendor/bin/rector是否可执行,而不是指望rector命令能直接敲出来(没配 PATH 就不行)
为什么必须写 rector.php 配置才能升级 PHPUnit
Rector 默认不启用任何规则,尤其 PHPUnit 升级涉及大量语义变更(比如 $this->assertEquals() → self::assertEquals()),不显式声明规则就等于白装。
最小可用配置长这样:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
<?php use Rector\Config\RectorConfig;
use Rector\PHPUnit\Set\PHPUnitSetList;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->sets([PHPUnitSetList::PHPUNIT_90]);
};
-
PHPUnitSetList::PHPUNIT_90这类常量必须按你目标版本选,不是“最新”就行:升到 PHPUnit 10 要用PHPUnitSetList::PHPUNIT_100,混用会漏改或误改 - 如果项目还在用
phpunit/phpunitv7 或更老,得先手动升级 PHPUnit 到 v9+,再跑 Rector —— Rector 的规则集不向下兼容 v7 的断言写法 - 配置里别漏掉
$rectorConfig->paths([...]),否则默认只扫src/,tests/下的测试文件根本不会被处理
运行 Rector 升级时常见报错和绕过方法
最典型的是 Class "PHPUnit\Framework\TestCase" not found,这通常不是 Rector 问题,而是它在分析时加载了你的测试文件,但 autoloader 没覆盖 tests/ 目录。
- 临时解决:在
rector.php里加$rectorConfig->autoloadPaths(['tests']); - 遇到
Cannot use PHPUnit\Framework\Assert as Assert because the name is already in use:说明你代码里有use PHPUnit\Framework\Assert;和use function PHPUnit\Framework\assert*;并存,Rector 会试图全转成函数调用,删掉类引用即可 - 升级后 CI 报
Undefined method assertSame():这是 PHPUnit 10 移除了部分方法,得配合PHPUnitSetList::PHPUNIT_100+ 手动替换为assertSame()→assertIsString()等新断言
哪些 PHPUnit 语法 Rector 不会自动改
Rector 处理的是“可静态分析”的语法迁移,像 $this->expectException() 改 #[ExpectedException] 这种注解升级它不管,因为 PHP 8 属性需要手动补 use 语句且上下文敏感。
-
dataProvider方法签名变化(比如从public function provider(): array到public static function provider(): array)需人工确认,Rector 只改调用侧 - 自定义断言、MockBuilder 链式调用(如
$mock->expects(...)->method(...))基本不动,得自己对照 PHPUnit 升级文档逐个核对 - 配置文件里的
phpunit.xml标签(如<coverage></coverage>结构)完全不在 Rector 范围内,别指望它帮你迁移到phpunit.xml.dist新格式
真正麻烦的从来不是 Rector 跑不跑得通,而是它改完之后,那些没被规则覆盖的边界 case 得你一行行看日志、比对 diff、再手动补 —— 尤其当项目混用 PHPUnit 7/8/9 风格的测试写法时。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










