Composer不支持命名空间重构,需用Rector等AST工具安全替换;必须同步更新代码、PSR-4映射、文件路径,并执行composer dump-autoload。

Composer 本身不提供命名空间重构能力,composer.json 中的 scripts 只是命令钩子,真正干活得靠外部工具——别指望写个 php -r 一行脚本就安全改完所有 use 和 class 声明。
为什么不能只靠 sed 或 find + replace
命名空间不是纯文本替换:同一字符串可能出现在注释、字符串字面量、JSON 值或正则表达式中;AppModelsUser 和 AppModelsUserInterface 不能被同一规则误伤;PHP 8.0+ 的联合类型(如 string|AppModelsUser)还要求语法感知。
- 直接用
sed -i 's/App\Old/My\New/g'会破坏"AppOldConfig"这类字符串 -
use AppOldFoo;改成use MyNewFoo;后,类内new Foo()不受影响,但new AppOldFoo()全局调用必须同步改 - PSR-4 自动加载映射(
"autoload": {"psr-4": {"App\": "app/"}})必须和文件路径、命名空间声明严格一致,漏改一处就Class not found
推荐方案:用 rector 配合 Composer 脚本驱动
rector 是 PHP 专用的 AST 重构工具,能精准识别命名空间上下文。它不依赖正则,而是解析为抽象语法树再修改,安全系数远高于文本替换。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 安装:
composer require rector/rector --dev - 生成基础配置:
vendor/bin/rector init,然后编辑rector.php - 关键配置项必须显式声明迁移规则:
use RectorRenamingRectorNameRenameClassRector; use RectorConfigRectorConfig; return static function (RectorConfig $rectorConfig): void { $rectorConfig->rules([RenameClassRector::class]); $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ 'AppOldUser' => 'MyNewUser', 'AppOldPost' => 'MyNewPost', ]); }; - 在
composer.json的scripts加一条:"refactor:ns": "vendor/bin/rector process app/ src/ --config rector.php --dry-run",先加--dry-run看效果
必须同步更新的三个地方,缺一不可
光改代码不够,PSR-4 映射、文件系统路径、以及 composer dump-autoload 三者必须闭环。
-
composer.json中的autoload和autoload-dev里的psr-4键值对要更新,例如把"App\": "app/"改成"My\New\": "src/" - 物理目录结构要匹配新命名空间:把
app/Models/User.php移到src/Models/User.php,否则即使代码改了,自动加载器也找不到 - 执行
composer dump-autoload(或composer install)刷新类映射,否则Class MyNewUser not found仍会发生 - 如果项目用了
classmap或files加载方式,这些条目也要手动检查并更新
最常被跳过的环节是目录移动和 autoload 更新——很多人只跑了 rector 就以为完事,结果测试跑不通,又回头怀疑工具是不是有问题。其实问题出在「代码」和「加载路径」两张皮没对齐。

















