shipmonk/dead-code-detector

Dead code detector 通过 PHPStan 扩展查找未使用的 PHP 代码。

安装次数: 7,674

依赖者: 4

建议者: 0

安全性: 0

星级: 48

关注者: 4

分支: 4

开放问题: 9

类型:phpstan-extension

0.3.0 2024-09-13 14:44 UTC

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 服务的构造函数调用!
  • #[AsEventListener] 属性
  • #[AsController] 属性
  • #[AsCommand] 属性
  • #[Required] 属性
  • #[Route] 属性
  • onKernelResponseonKernelRequest

Doctrine

  • #[AsEntityListener] 属性
  • Doctrine\ORM\Events::* 事件
  • Doctrine\Common\EventSubscriber 方法
  • 生命周期事件属性 #[PreFlush]#[PostLoad]

PHPUnit

  • 数据提供者方法
  • testXxx 方法
  • @test@before@afterClass 等注释
  • #[Test]#[Before]#[AfterClass] 等属性

PHPStan

  • DIC 服务的构造函数调用(规则、扩展等)

Nette

  • handleXxxrenderXxxactionXxxinjectXxxcreateComponentXxx
  • 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