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ě
  • uselessAlias odstraní alias, který jméno nemění
  • uselessSameNamespaceImport odstraní import z vlastního jmenného prostoru
  • nameNotation rozhoduje, jestli se jména tříd, funkcí a konstant importují, nebo píšou s úvodním lomítkem

Zdroj

Třída UnusedImportsRule, fixtury unusedImports.