PHPMD不能检测冗余依赖,仅分析源码坏味道;检测包冗余必须用composer-unused,它通过扫描use、new等实际引用反向比对composer.json,但需人工验证反射、注解、配置驱动等误报场景。

PHPMD 本身不检测冗余依赖,它只分析 PHP 源码中的代码坏味道(如未使用参数、空 catch、过长方法等);检测“包是否冗余”得用 composer-unused,不是 phpmd。
PHPMD 能做什么、不能做什么
它是个静态代码分析器,输入是你的 PHP 源文件(src/、app/),输出是潜在设计/可读性问题。它完全不读 composer.json,也不关心 vendor 里装了什么包——所以它无法告诉你 monolog/monolog 是否被项目真正用到。
常见误判现象包括:
- 把用了 DI 容器注入但没显式
new或use的类标为“未使用” - 对配置驱动的类(如
'handler' => \think\queue\connector\Redis::class)完全无感知 - 不扫描 Twig/Blade 模板、YAML/PHP 配置文件里的类名字符串
正确安装和调用 PHPMD 的最小可行路径
别全局装,直接 dev 依赖更可控:
立即学习“PHP免费学习笔记(深入)”;
composer require --dev phpmd/phpmd
装完后确保 vendor/bin/phpmd 可执行。运行时必须指定规则集和目标路径:
-
phpmd不自动猜你要扫哪——必须写明路径,比如src或app - 规则集选错会导致漏报:
codesize查复杂度,design查耦合,naming查命名规范;单用unusedcode规则集也只查函数/变量级未使用,不查包级冗余 - 默认输出是文本,加
--report-format=xml才能对接 CI 工具
示例命令:
vendor/bin/phpmd src text unusedcode,design --exclude tests/,vendor/
为什么有人误以为 PHPMD 能查冗余包
因为名字里有 “Mess Detector”,又常和 composer-unused 一起出现在质量工具链里。但二者职责完全不同:
-
phpmd:分析你写的 PHP 类/方法/变量有没有“写得烂” -
composer-unused:分析你use和new过哪些类,再反推哪些vendor/包根本没被触碰过
如果你真想查包冗余,必须换工具:composer-unused 是当前唯一能基于真实调用痕迹做判断的方案,且需人工核验三类高危误报:polyfill 包、PSR 接口、注解/配置驱动类。
最易被忽略的一点:PHPMD 的 unusedcode 规则只标记源码中定义但未被调用的函数或变量,它不会跨文件追踪 class_exists('SomeClass') 这种反射调用——而这类调用恰恰是框架里“隐式使用”的主因。



















