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
、createComponentXxx
SmartObject
魔法调用用于@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