unused-imports
Import, který kód nikde nepoužije, se odstraní.
Opravuje · ve skupině cleanup · v presetech dresscode/nette,
dresscode/symfony · pokrývá
no_unused_imports, SlevomatCodingStandard.Namespaces.UnusedUses
Co pravidlo hlídá
Každý use na začátku souboru je slib, že se to jméno v kódu objeví. Když slib neplatí, import jen mate:
čtenář hledá, kde se třída používá, a našeptávání v editoru ho vede na cestu, která nikam nevede. Pravidlo projde
všechny importy tříd, funkcí i konstant a ty, které nic nepoužívá, smaže.
Použití je jakýkoli výskyt importovaného jména nebo jeho aliasu v kódu: v typu parametru či vlastnosti, za
new, extends, implements, instanceof, v catch, v atributu, v
::class, i jako první část částečně kvalifikovaného jména (Prefix\Deep použije import
Prefix). Jméno zapsané v řetězci se nepočítá, protože pro PHP to je jen text. Jména tříd a funkcí se
srovnávají bez ohledu na velikost písmen, jména konstant přesně, tak jak to dělá PHP.
Import zmíněný jen v dokumentačním komentáři (@var Order, @param User[], ale i
@see Order::total() nebo {@link Order}) se počítá jako použitý, protože ho čte PHPStan i IDE;
volba searchAnnotations to umí vypnout. Z importu s několika jmény (use A, B;) a ze skupinového
importu (use App\{A, B};) pravidlo odstraní jen nepoužitou položku.
Příklad
namespace App;
use App\Model\User;
use App\Model\Order; // The import of 'Order' is unused
use App\Model\Address;
use function App\format;
use function App\slugify; // The import of 'slugify' is unused
class Profile
{
/** @var Address[] */
private array $addresses = [];
public function __construct(
private User $user,
) {
}
public function render(): string
{
return format($this->user);
}
}
namespace App;
use App\Model\User;
use App\Model\Address;
use function App\format;
class Profile
{
/** @var Address[] */
private array $addresses = [];
public function __construct(
private User $user,
) {
}
public function render(): string
{
return format($this->user);
}
}
Address zůstal, protože se vyskytuje v anotaci @var; kdyby pravidlo import smazalo, PHPStan by
přestal typu rozumět.
Volby
searchAnnotations
bool, výchozí true. Jméno třídy zmíněné v dokumentačním komentáři se počítá jako
použití importu.
Vypnout to dává smysl jen v kódu, kde dokumentační komentáře nečte žádný nástroj. Jinak import, který drží jen anotace, po smazání chybí PHPStanu i našeptávání v editoru.
rules:
dresscode/unused-imports:
searchAnnotations: false
namespace App;
use App\Model\Address; // The import of 'Address' is unused
use App\Model\User;
/**
* @param Address[] $addresses
*/
function first(array $addresses, User $owner): mixed
{
return $addresses[0] ?? null;
}
namespace App;
use App\Model\User;
/**
* @param Address[] $addresses
*/
function first(array $addresses, User $owner): mixed
{
return $addresses[0] ?? null;
}
Související pravidla
ordered-importsřadí importy abecedněuseless-aliasodstraní alias, který jméno neměníuse-from-same-namespaceodstraní import z vlastního jmenného prostoruname-notationrozhoduje, jestli se jména tříd, funkcí a konstant importují, nebo píšou s úvodním lomítkem
Zdroj
Třída UnusedImportsRule, fixtury unused-imports.