tomasvotruba/unused-public
PHPStan extension that finds unused public methods, properties, and constants by scanning calls across your codebase. Helps clean up dead APIs or spot members that should be private/protected. Supports gradual adoption via allowed % thresholds and excluding template-used methods.
It's easy to find unused private class elements, because they're not used in the class itself. But what about public methods/properties/constants?
final class Book
{
public function getTitle(): string
{
// ...
}
- public function getSubtitle(): string
- {
- // ...
- }
}
How can we detect unused public element?
That's exactly what this package does.
This technique is very useful for private projects and to detect accidentally used public modifier that should be changed to private as called locally only.
composer require tomasvotruba/unused-public --dev
The package is available for PHP 7.2+ version.
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 have hundreds of reported public method? You don't have time to check them all, but want to handle them gradually?
Set maximum allowed % configuration instead:
# phpstan.neon
parameters:
unused_public:
methods: 2.5
This means maximum 2.5 % of all public methods is allowed as unused:
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
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
In some cases, the rules report false positives:
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;
}
}
How can I help you explore Laravel packages today?