shipmonk / dead-code-detector
Dead code detector 通过 PHPStan 扩展查找未使用的 PHP 代码。
0.3.0
2024-09-13 14:44 UTC
Requires
- php: ^7.4 || ^8.0
- phpstan/phpstan: ^1.11.0
Requires (Dev)
- doctrine/orm: ^2.19 || ^3.0
- editorconfig-checker/editorconfig-checker: ^10.3.0
- ergebnis/composer-normalize: ^2.28
- nette/application: ^3.1
- nette/component-model: ^3.0
- nette/utils: ^3.0 || ^4.0
- phpstan/phpstan-phpunit: ^1.1.1
- phpstan/phpstan-strict-rules: ^1.2.3
- phpstan/phpstan-symfony: ^1.4
- phpunit/phpunit: ^9.5.20
- shipmonk/composer-dependency-analyser: ^1.6
- shipmonk/name-collision-detector: ^2.0.0
- shipmonk/phpstan-rules: ^3.1
- slevomat/coding-standard: ^8.15.0
- symfony/contracts: ^2.5 || ^3.0
- symfony/event-dispatcher: ^5.4 || ^6.0 || ^7.0
- symfony/routing: ^5.4 || ^6.0 || ^7.0
This package is auto-updated.
Last update: 2024-09-19 12:02:14 UTC
README
PHPStan 扩展,轻松在项目中查找未使用的 PHP 代码!
安装
composer require --dev shipmonk/dead-code-detector
使用 官方扩展安装器 或直接加载规则
includes: - vendor/shipmonk/dead-code-detector/rules.neon
支持的库
- 来自
vendor的任何重写方法都不会报告为死代码 - 我们还支持以下库中的许多魔法调用
Symfony
- DIC 服务的构造函数调用!
phpstan/phpstan-symfony使用containerXmlPath必须使用
#[AsEventListener]属性#[AsController]属性#[AsCommand]属性#[Required]属性#[Route]属性onKernelResponse、onKernelRequest等
Doctrine
#[AsEntityListener]属性Doctrine\ORM\Events::*事件Doctrine\Common\EventSubscriber方法- 生命周期事件属性
#[PreFlush]、#[PostLoad]等
PHPUnit
- 数据提供者方法
testXxx方法- 如
@test、@before、@afterClass等注释 - 如
#[Test]、#[Before]、#[AfterClass]等属性
PHPStan
- DIC 服务的构造函数调用(规则、扩展等)
Nette
handleXxx、renderXxx、actionXxx、injectXxx、createComponentXxxSmartObject魔法调用用于@property注释
所有这些库在找到您的 composer 依赖项时都会自动启用。如果想要强制启用/禁用其中的一些,您可以
# phpstan.neon.dist parameters: shipmonkDeadCode: entrypoints: phpunit: enabled: true
自定义
- 如果您的应用程序执行了此库所不知的魔法调用,您可以实现自己的入口点提供程序。
- 只需使用
shipmonk.deadCode.entrypointProvider标记并实现ShipMonk\PHPStan\DeadCode\Provider\MethodEntrypointProvider - 您可以通过扩展
ShipMonk\PHPStan\DeadCode\Provider\MethodBasedEntrypointProvider来简化您的实现
# phpstan.neon.dist services: - class: App\ApiOutputEntrypointProvider tags: - shipmonk.deadCode.entrypointProvider
use ReflectionMethod; use ShipMonk\PHPStan\DeadCode\Provider\SimpleMethodEntrypointProvider; class ApiOutputEntrypointProvider extends SimpleMethodEntrypointProvider { public function isEntrypointMethod(ReflectionMethod $method): bool { return $method->getDeclaringClass()->implementsInterface(ApiOutput::class)); } }
与 tomasvotruba/unused-public 的比较
- 您可以在 详细的比较 PR 中看到
- 基本上,他们的分析不够精确且不够灵活。主要
- 它无法检测死构造函数
- 它无法正确检测继承层次结构内的调用
- 它不提供任何自定义的已用方法调整
- 它几乎没有内置的库扩展
- 它忽略了 trait 方法
- 它缺乏许多小功能,如类字符串调用、动态方法调用、数组回调、nullsafe 调用链等
限制
- 目前仅检测方法调用
- 包括 构造函数、静态方法、trait 方法、接口方法、一等调用者、克隆等。
- 未检测到混合类型上的任何调用,例如
$unknownClass->method() - 忽略匿名类(PHPStan 限制)
- 不检查大多数魔法方法(如
__get、__set等) - 尚未实现调用图
- 未执行传递性检查(只有从死方法调用死方法)
- 未检测到死循环(例如,方法自我调用)
贡献
- 使用
composer check检查您的代码 - 通过
composer fix:cs自动修复编码风格 - 所有功能必须经过测试
支持的PHP版本
- PHP 7.4 - 8.3