composer 不检测未引用的类文件,需用 phpstan + phpstan-dead-code 检测;移除前须确认是否被框架、注解或插件机制间接使用,并同步清理 autoload 配置与缓存。

Composer 本身不检测未引用的类文件
Composer 是依赖管理器,不是静态分析工具。它只管 autoload 配置是否合法、类名能否映射到路径,不管某个类是否在项目中被实际使用。所谓“未引用的类文件”,属于代码死代码(dead code)问题,必须靠外部工具识别。
用 PHPStan + phpstan-dead-code 检测未使用的类
PHPStan 是主流 PHP 静态分析工具,phpstan-dead-code 扩展专门识别未定义、未调用、未实例化的类/方法/属性。它能发现那些被自动加载但从未被任何地方 new、extends、implements、use 或反射调用的类。
实操建议:
- 安装:
composer require --dev phpstan/phpstan phpstan/phpstan-dead-code - 运行:
vendor/bin/phpstan analyse --level=8 src/(--level=8启用 dead-code 规则) - 常见误报场景:类仅被
class_exists()、interface_exists()或注解(如 Doctrine、Symfony)引用,此时需加// @phpstan-ignore-next-line或配置ignoreErrors - 注意:该检查依赖准确的类型信息,若项目大量使用
eval、动态类名拼接或魔术方法,检出率会下降
移除前先确认是否真没被用到
静态分析结果只是线索,不是判决书。很多“未引用”类其实通过以下方式间接生效:
- 被框架容器自动注册(如 Symfony 的
App\EventListener\*自动订阅事件) - 被注解驱动(如
@Route、@Entity、@Swagger\Definition) - 被插件机制扫描(如 WordPress 的
class-wp-*.php命名约定) - 被测试代码覆盖但主逻辑未调用(
tests/下的类常被误判)
建议操作顺序:git grep 'ClassName' → 查 composer.json 中 autoload 映射 → 看框架文档是否要求保留 → 最后才删文件。
删完记得清理 autoload 映射和缓存
直接删文件但不更新 Composer 配置,会导致下次 composer dump-autoload 报错或产生残留映射。
关键步骤:
- 从
composer.json的autoload/autoload-dev中移除对应路径或命名空间条目 - 运行
composer dump-autoload -o(-o强制优化,可暴露映射冲突) - 检查
vendor/composer/autoload_*.php是否还包含已删类的映射(如有,说明配置没清干净) - 如果用了 APCu 或 OPcache,记得
opcache_reset()或重启 Web 服务,避免旧类仍可被class_exists()返回 true
真正麻烦的从来不是找到哪些类没用,而是确认它为什么没用——是废弃了,还是你根本没看懂它的触发方式。










