Автозагрузка классов
Поиск и подключение файлов классов в Yii реализовано при помощи
автозагрузки классов. Фреймворк предоставляет свой быстрый
совместимый с PSR-4
автозагрузчик, который устанавливается в момент подключения Yii.php
.
Note: Для простоты повествования, в этом разделе мы будем говорить только об автозагрузке классов. Тем не менее, всё описанное применимо к интерфейсам и трейтам.
Как использовать автозагрузчик Yii
При использовании автозагрузчика классов Yii следует соблюдать два простых правила создания и именования классов:
- Каждый класс должен принадлежать пространству имён
(то есть
foo\bar\MyClass
). - Каждый класс должен находиться в отдельном файле, путь к которому определятся следующим правилом:
// $className — это абсолютное имя класса без начального "\"
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
Например, если абсолютное имя класса foo\bar\MyClass
, то псевдоним пути данного файла будет
@foo/bar/MyClass.php
. Для того, чтобы данный псевдоним можно было преобразовать в путь к файлу, необходимо чтобы
либо @foo
либо @foo/bar
являлся корневым псевдонимом.
При использовании шаблона приложения basic вы можете хранить свои классы в пространстве имён app
.
В этом случае они будут загружаться автоматически без создания нового псевдонима. Это работает потому как @app
является заранее определённым псевдонимом и такое имя класса как
app\components\MyClass
в соответствии с описанным выше алгоритмом преобразуется в путь
директорияПриложения/components/MyClass.php
.
В шаблоне приложения advanced каждый уровень приложения обладает собственным корневым
псевдонимом. Например, для frontend корневым псевдонимом является @frontend
, а для backend — @backend
. Это позволяет
разместить классы frontend в пространство имён frontend
, а классы backend в пространство имён backend
. При этом
классы будут загружены автоматически.
Карта классов
Автозагрузчик Yii поддерживает карту классов. Эта возможность позволяет указать путь к файлу для каждого имени класса. При загрузке класса автозагрузчик проверяет наличие класса в карте. Если он там есть, соответствующий файл будет загружен напрямую без каких-либо дополнительных проверок. Это делает автозагрузку очень быстрой. Все классы самого фреймворка загружаются именно этим способом.
Вы можете добавить класс в карту Yii::$classMap
следующим образом:
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
Для указания путей к файлам классов можно использовать псевдонимы. Карту классов необходимо сформировать в процессе первоначальной загрузки так как она должна быть готова до использования классов.
Использование других автозагрузчиков
Так как Yii использует Composer в качестве менеджера зависимостей, рекомендуется дополнительно установить его автозагрузчик. Если вы используете какие-либо сторонние библиотеки, в которых есть свои автозагрузчики, эти автозагрузчики также необходимо установить.
При использовании дополнительных автозагрузчиков файл Yii.php
должен быть подключен после их установки. Это позволит
автозагрузчику Yii первым пробовать загрузить класс. К примеру, приведённый ниже код взят из
входного скрипта шаблона приложения basic. Первая строка устанавливает
автозагрузчик Composer, а вторая — автозагрузчик Yii:
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако, скорость автозагрузки в этом случае может уменьшится. Также вам будет необходимо следовать правилам автозагрузчика Composer.
Info: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла
Yii.php
и подключите его в входном скрипте.
Автозагрузка классов расширений
Автозагрузчик Yii может автоматически загружать классы расширений в том случае, если соблюдается единственное правило. Расширение должно правильно описать раздел 'autoload' в файле 'composer.json'. Более подробно об этом можно узнать из официальной документации Composer.
Если вы не используете автозагрузчик Yii, то классы расширений могут быть автоматически загружены с помощью автозагрузчика Composer.