neoighodaro/unused-public

Detect unused public properties, constants and methods in your code

Installs: 1 052

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 12

Type:phpstan-extension

1.0.0 2024-03-31 14:59 UTC

This package is auto-updated.

Last update: 2024-10-31 00:18:11 UTC


README



It's easy to find unused private class elements, because they're not used in the class itself:

 final class Book
 {
     public function getTitle(): string
     {
         // ...
     }

-    private function getSubtitle(): string
-    {
-        // ...
-    }
}

But what about public class elements?


How can we detect such element?

  • find a e.g. public method
  • find all public method calls
  • compare those in simple diff
  • if the public method is not found, it probably unused

That's exactly what this package does.


This technique is very useful for private projects and to detect accidentally open public API that should be used only locally.


Install

composer require tomasvotruba/unused-public --dev

The package is available on PHP 7.2-8.1 versions in tagged releases.


Usage

With PHPStan extension installer, everything is ready to run.

Enable each item on their own with simple configuration:

# phpstan.neon
parameters:
    unused_public:
        methods: true
        properties: true
        constants: true

Do you want to check local-only method calls that should not be removed, but be turned into private/protected instead?

# phpstan.neon
parameters:
    unused_public:
        local_methods: true

Exclude methods called in templates

Some methods are used only in TWIG or Blade templates, and could be reported false positively as unused.

{{ book.getTitle() }}

How can we exclude them? Add your TWIG or Blade template directories in config to exclude methods names:

# phpstan.neon
parameters:
    unused_public:
        template_paths:
            - templates

Known Limitations

In some cases, the rules report false positives:

  • when used only in templates, apart Twig paths, it's not possible to detect them

Skip Public-Only Methods

Open-source vendors design public API to be used by projects. Is element reported as unused, but it's actually designed to be used public?

Mark the class or element with @api annotation to skip it:

final class Book
{
    /**
     * @api
     */
    public function getName()
    {
        return $this->name;
    }
}

You can also use the @required or @internal to make it clearer in certain situations that you want the check skipped or that it is used internally. In this situation in Laravel, while the direct call is not present, it can be used as a property when referencing relationships in Laravel Eloquent models:

<?php

class User extends Model
{
    // ...

    /**
     * @internal
     */
    public $timestamps = false;

    /**
     * @required
     */
    public function post(): HasOne
    {
        return $this->hasOne(Post::class);
    }

    // ...
}