Автозавантаження класів

Пошук і підключення файлів класів в 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 був кореневим псевдонімом.

При використанні базового шаблону додатка ви можете зберігати свої класи в просторі імен верхнього рівня app, щоб вони могли бути автоматично завантажені Yii без створення нового псевдоніма. Це працює, тому як @app є заздалегідь визначеним псевдонімом і таке імʼя класу, як app\components\MyClass відповідно до описаного вище алготімом перетвориться в шлях AppBasePath/components/MyClass.php.

У розширеному шаблоні додатка кожен рівень додатку володіє власним кореневим псевдонімом. Наприклад, для frontend кореневим псевдонімом є @frontend, а для backend — @backend. Це дозволяє розмістити класи frontend в простір імен frontend, а класи backend - в простір імен backend. Це дозволить вказаним класам бути автоматично завантаженими засобами Yii.

Мапа класів

Автозавантажувач Yii підтримує мапу класів. Ця можливість дозволяє вказати шлях до файлу для кожного імені класу. При завантаженні класу автозавантажувач перевіряє наявність класу в мапі. Якщо він там є, відповідний файл буде завантажений безпосередньо без будь-яких додаткових перевірок. Це робить автозагрузку дуже швидкою. Всі класи самого фреймворку завантажуються саме цим способом.

Ви маєте можливість додати клас в мапу Yii::$classMap наступним чином:

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

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

Використання інших автозавантажувачів

Оскільки Yii використовує Composer у якості менеджера залежностей, рекомендується додатково встановити його автозавантажувач. Якщо ви використовуєте які-небудь сторонні бібліотеки із власними автозавантажувачами, то ці автозавантажувачі також необхідно встановити.

При використанні додаткових автозавантажувачів, файл Yii.php повинен бути підключений після їх установки. Це дозволить автозавантажувачу Yii першим намагатися завантажити клас. Наприклад, наведений нижче код взятий з вхідного скрипта базового шаблону додатка. Перший рядок встановлює автозавантажувач Composer, а другий - автозавантажувач Yii:

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

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

Info: Якщо ви не хочете використовувати автозавантажувач Yii, створіть свою версію файлу Yii.php і підключіть його у вхідному скрипті.

Автозавантаження класів розширень

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

Якщо ви не використовуєте автозавантажувач Yii, то класи розширень можуть бути автоматично завантажені з допомогою автозавантажувач Composer.