neoighodaro / unused-public
Detect unused public properties, constants and methods in your code
Installs: 1 139
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 12
Type:phpstan-extension
Requires
- php: ^8.2
- nikic/php-parser: ^5.0
- phpstan/phpstan: ^2.0
- webmozart/assert: ^1.11
Requires (Dev)
- phpstan/extension-installer: ^2.0
- phpunit/phpunit: ^10.5
- rector/rector: ^1.2.5
- shipmonk/composer-dependency-analyser: ^1.7
- symplify/easy-ci: ^12.1
- symplify/easy-coding-standard: ^12.3
- symplify/phpstan-rules: ^13.0
- tomasvotruba/class-leak: ^0.2.11
- tomasvotruba/type-coverage: ^0.3
- tracy/tracy: ^2.10
README
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?
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 used public
modifier that should be changed to private
as called locally only.
Install
composer require tomasvotruba/unused-public --dev
The package is available for PHP 7.2+ version.
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 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:
- If it's 5 %, you'll be alerted.
- If it's 1 %, it will be skipped as tolerated.
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); } // ... }