Класс автозагрузки

Yii полагается на механизм автозагрузки класса для поиска и включения всех необходимых файлов классов. Он обеспечивает высокопроизводительный класс автозагрузчика, соответствующий стандарту PSR-4. Автозагрузчик устанавливается при включении файла Yii.php.

Использование автозагрузчика Yii

Чтобы использовать автозагрузчик класса Yii, вы должны следовать двум простым правилам при создании и присвоении имен вашим классам:

  • каждый класс должен находиться под пространством имен (например, foo\bar\MyClass)
  • каждый класс должен быть сохранен в отдельном файле, путь которого определяется по следующему алгоритму:
// $className is a fully qualified class name without the leading backslash
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

Например, если именем класса и пространства имен является foo\bar\MyClass, псевдоним для соответствующего пути к файлу класса будет @foo/bar/MyClass.php. Чтобы этот псевдоним был разрешимым в путь к файлу, либо @foo, либо @ foo/bar должен быть корневым псевдонимом.

При использовании базового шаблона проекта вы можете поместить ваши классы в приложение верхнего уровня пространства имен, чтобы они могли автоматически загружаться Yii без необходимости определения нового псевдонима. Это связано с тем, что @app является предопределенным псевдонимом, а имя класса, например app\components\MyClass, может быть разрешено в файл класса AppBasePath/components/MyClass.php в соответствии с описанным алгоритмом.

В шаблоне расширенного проекта каждый уровень имеет собственный корневой псевдоним. Например, уровень front-end имеет корневой псевдоним @frontend, а псевдоним корня корневого уровня - @backend. В результате вы можете разместить интерфейсные классы в интерфейсе пространства имен, в то время как backend-классы находятся под backend. Это позволит автозагрузке этих классов автозагрузчиком Yii.

Карта класса

Автозагрузчик классов Yii поддерживает функцию отображения классов, которая сопоставляет имена классов с соответствующими путями к файлам классов. Когда автозагрузчик загружает класс, он сначала проверяет, найден ли класс на карте. Если да, то соответствующий путь к файлу будет включен непосредственно без дополнительных проверок. Это делает суперзагрузку класса супер быстрой. Фактически, все основные классы Yii автозагружаются таким образом.

Вы можете добавить класс к карте классов, сохраненный в Yii::$classMap, используя:

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

Псевдонимы могут использоваться для указания путей к файлам классов. Вы должны установить карту класса в процессе начальной загрузки, чтобы карта была готова до использования ваших классов.

Использование других автозагрузчиков

Поскольку Yii использует Composer как диспетчер зависимостей пакетов, рекомендуется также установить автозагрузчик Composer. Если вы используете сторонние библиотеки, у которых есть собственные автозагрузчики, вы также должны установить их.

При использовании автозагрузчика Yii вместе с другими автозагрузчиками следует включить файл Yii.php после установки всех других автозагрузчиков. Это заставит автозагрузчик Yii первым отвечать на любой запрос автозагрузки класса. Например, следующий код извлекается из сценария входа шаблона Basic Project. В первой строке устанавливается автозагрузчик Composer, а во второй строке устанавливается автозагрузчик Yii:

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

Вы можете использовать автозагрузчик Composer самостоятельно без автозагрузчика Yii. Однако, при этом производительность вашего класса автозагрузки может ухудшиться, и вы должны следовать правилам, установленным Composer для того, чтобы ваши классы могли быть автоматически загружаемыми.

Автозагрузка классов расширений

Автозагрузчик Yii способен автоматически загружать классы расширений. Единственным требованием является то, что расширение задает раздел autoload в своем файле composer.json. Если вы не используете автозагрузчик Yii, автозагрузчик Composer может по-прежнему автозагрузить классы расширений.