unusedImports
Import, který kód nikde nepoužije, se odstraní.
Opravuje · ve skupině cleanup · v presetech nette, 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 třídy zmíněný jen v dokumentačním komentáři (@var Order, @param User[], ale i
@see Order::total(), {@link Order} nebo jméno anotace jako @DB\Entity) se počítá jako
použitý, protože ho čte PHPStan i IDE; volba annotations to umí vypnout. Import funkce nebo konstanty se tak
nepočítá, ten musí použít kód. 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
annotations
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:
unusedImports:
annotations: 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
orderedImportsřadí importy abecedněuselessAliasodstraní alias, který jméno neměníuselessSameNamespaceImportodstraní import z vlastního jmenného prostorunameNotationrozhoduje, jestli se jména tříd, funkcí a konstant importují, nebo píšou s úvodním lomítkem
Zdroj
Třída UnusedImportsRule, fixtury unusedImports.