Importy

Sekce imports rozhoduje o příkazech use na začátku souboru: jestli má každé jméno vlastní příkaz, nebo jich víc sdílí jeden, kdy se píše skupinový import use App\{A, B}, v jakém pořadí importy stojí a co se stane s importem, který nic nepoužívá.

Které jméno se importuje a které píše s lomítkem, rozhoduje sekce qualification; tahle sekce rozhoduje o tom, jak importy vypadají. Klíče classes, functions a constants říkají, jestli má každé jméno svůj use (separate), nebo všechna jména jednoho druhu jeden společný (combined). Skupinový import zakáže nebo vyžádá groupUse, pořadí order a prázdné řádky mezi importy a za nimi sekce blankLines.

imports:
	classes: separate
	functions: combined
	order: byKind
	unused: forbidden
	ofCurrentNamespace: forbidden
namespace App\Model;

use App\Model\Order;  // Useless import of `Order` from the current namespace.
use App\Util\Clock, App\Util\Money;  // Expected one import per `use` statement, 2 found.
use function count;
use function strlen;  // Expected all imports of functions in one `use` statement. // The import of `strlen()` is unused.
use function trim;  // Expected all imports of functions in one `use` statement.

class Cart
{
	public function total(Order $order, Clock $clock): Money
	{
		return new Money(count($order->items), trim($order->note));
	}
}
namespace App\Model;

use App\Util\Clock;
use App\Util\Money;
use function count, trim;

class Cart
{
	public function total(Order $order, Clock $clock): Money
	{
		return new Money(count($order->items), trim($order->note));
	}
}

Jméno zmíněné jen v dokumentačním komentáři (@var Address[]) se počítá jako použité, protože ho čte PHPStan i editor; vypnout to jde parametrem phpdoc.namesUseImports.

imports.classes

How the imports of classes are spread over use statements.

  • separate: a use of its own for every name, use Foo; use Bar;
  • combined: all names of the kind in one use, use Foo, Bar;, one per namespace declaration
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette separate, symfony separate · pokrývá single_import_per_statement, SlevomatCodingStandard.Namespaces.MultipleUsesPerLine

imports.functions

How the imports of functions are spread over use statements.

  • separate: a use of its own for every name, use Foo; use Bar;
  • combined: all names of the kind in one use, use Foo, Bar;, one per namespace declaration
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette combined, symfony separate · pokrývá single_import_per_statement, SlevomatCodingStandard.Namespaces.MultipleUsesPerLine

imports.constants

How the imports of constants are spread over use statements.

  • separate: a use of its own for every name, use Foo; use Bar;
  • combined: all names of the kind in one use, use Foo, Bar;, one per namespace declaration
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette combined, symfony separate · pokrývá single_import_per_statement, SlevomatCodingStandard.Namespaces.MultipleUsesPerLine

imports.groupUse

The group use, a kind written combined never grouped and a name of the global namespace standing apart.

  • forbidden: a group use of a kind decided above is expanded into the shape of that kind
  • required: the imports of one namespace are written as one group use, use Acme\Shop\{Order, Cart};
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette keep, symfony forbidden · pokrývá group_import, single_import_per_statement, SlevomatCodingStandard.Namespaces.DisallowGroupUse, SlevomatCodingStandard.Namespaces.MultipleUsesPerLine

imports.groupUseFrom

How many names of one namespace make a group use, a group of fewer written as imports of their own.

  • počet od 2

Parametr, výchozí 2 · standardy: perCs 2, psr12 2, nette 2, symfony 2 · pokrývá single_import_per_statement

imports.groupUseOverMaxLength

A group use too long for its line spreads over lines, its names filling them.

  • split: spreads a group use over lines where its line would be too long, its names filling the lines
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette keep, symfony keep

imports.order

The order of consecutive imports, the names of a statement poured back into statements of the shapes written.

  • byKind: classes, then functions, then constants, each alphabetical
  • byKindOnly: classes, then functions, then constants, each in the order written
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs byKindOnly, psr12 byKindOnly, nette byKind, symfony byKind · pokrývá ordered_imports, SlevomatCodingStandard.Namespaces.AlphabeticallySortedUses

imports.orderCaseSensitive

Whether Acme sorts before acme rather than with it.

  • true, nebo false

Parametr, výchozí false · standardy: perCs false, psr12 false, nette false, symfony false · pokrývá ordered_imports, SlevomatCodingStandard.Namespaces.AlphabeticallySortedUses

imports.unused

An import nothing uses is removed.

  • forbidden: never there
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette forbidden, symfony forbidden · pokrývá no_unused_imports, SlevomatCodingStandard.Namespaces.UnusedUses

Z importu s několika jmény (use A, B;) a ze skupinového importu (use App\{A, B};) se odstraní jen nepoužitá položka.

imports:
	unused: forbidden
namespace App;

use App\Model\User;
use App\Model\Order;  // The import of `Order` is unused.
use App\Model\Address;

class Profile
{
	/** @var Address[] */
	private array $addresses = [];

	public function __construct(
		private User $user,
	) {
	}
}
namespace App;

use App\Model\User;
use App\Model\Address;

class Profile
{
	/** @var Address[] */
	private array $addresses = [];

	public function __construct(
		private User $user,
	) {
	}
}

Address zůstal, protože se vyskytuje v anotaci @var; kdyby import zmizel, PHPStan by přestal typu rozumět.

imports.aliasEqualToName

use Foo as Foo;.

  • forbidden: never there
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette forbidden, symfony keep · pokrývá SlevomatCodingStandard.Namespaces.UselessAlias

imports.ofCurrentNamespace

use App\Foo; inside namespace App.

  • forbidden: never there
  • keep: nic se nevynucuje, kód zůstane, jak je

Požadavek · standardy: perCs keep, psr12 keep, nette forbidden, symfony keep · pokrývá SlevomatCodingStandard.Namespaces.UseFromSameNamespace