concept-autoloading.md 7.94 KB
Newer Older
zxcq544 committed
1 2 3
Автозагрузка классов
=================

4 5 6 7
Поиск и подключение файлов классов в Yii реализовано при помощи
[автозагрузки классов](http://www.php.net/manual/ru/language.oop5.autoload.php). Фреймворк предоставляет свой быстрый
совместимый с [PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md)
автозагрузчик, который устанавливается в момент подключения `Yii.php`.
zxcq544 committed
8

9 10
> Примечание: Для простоты повествования, в этом разделе мы будем говорить только об автозагрузке классов. Тем не менее,
  всё описанное применимо к интерфейсам и трейтам.
zxcq544 committed
11 12

Как использовать автозагрузчик Yii <a name="using-yii-autoloader"></a>
13
--------------------------------------------------------------
zxcq544 committed
14

15
При использовании автозагрузчика классов Yii следует соблюдать два простых правила создания и именования классов:
zxcq544 committed
16

17 18
* Каждый класс должен принадлежать пространству имён (то есть `foo\bar\MyClass`).
* Каждый класс должен находиться в отдельном файле, путь к которому определятся следующим правилом:
zxcq544 committed
19 20

```php
21
// $className — это абсолютное имя класса, начинающееся с "\"
zxcq544 committed
22 23 24
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
```

25 26 27
Например, если абсолютное имя класса `foo\bar\MyClass`, то [псевдоним пути](concept-aliases.md) данного файла будет
`@foo/bar/MyClass.php`. Для того, чтобы данный псевдоним можно было преобразовать в путь к файлу, необходимо чтобы
либо `@foo` либо `@foo/bar` являлся [корневым псевдонимом](concept-aliases.md#defining-aliases).
zxcq544 committed
28

Qiang Xue committed
29
При использовании [шаблона приложения basic](start-installation.md) вы можете хранить свои классы в пространстве имён `app`.
30 31 32 33
В этом случае они будут загружаться автоматически без создания нового псевдонима. Это работает потому как `@app`
является [заранее определённым псевдонимом](concept-aliases.md#predefined-aliases) и такое имя класса как
`app\components\MyClass` в соответствии с описанным выше алготимом преобразуется в путь
`директорияПриложения/components/MyClass.php`.
zxcq544 committed
34

35 36 37 38
В [шаблоне приложения advanced](tutorial-advanced-app.md) каждый уровень приложения обладает собственным корневым
псевдонимом. Например, для frontend корневым псевдонимом является `@frontend`, а для backend — `@backend`. Это позволяет
разместить классы frontend в пространство имён `frontend`, а классы backend в пространство имён `backend`. При этом
классы будут загружены автоматически.
zxcq544 committed
39 40 41


Карта классов <a name="class-map"></a>
42
---------------------------------
zxcq544 committed
43

44 45 46 47
Автозагрузчик Yii поддерживает *карту классов*. Эта возможность позволяет указать путь к файлу для каждого имени класса.
При загрузке класса автозагрузчик проверяет наличие класса в карте. Если он там есть, соответствующий файл будет загружен
напрямую без каких-либо дополнительных проверок. Это делает автозагрузку очень быстрой. Все классы самого фреймворка
загружаются именно этим способом.
zxcq544 committed
48

49
Вы можете добавить класс в карту `Yii::$classMap` следующим образом:
zxcq544 committed
50 51 52 53 54

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

55 56 57
Для указания путей к файлам классов можно использовать [псевдонимы](concept-aliases.md). Карту классов необходимо
сформировать в процессе [первоначальной загрузки](runtime-bootstrapping.md) так как она должна быть готова до
использования классов.
zxcq544 committed
58 59 60


Использование других автозагрузчиков <a name="using-other-autoloaders"></a>
61
------------------------------------------------------------------
zxcq544 committed
62

63 64 65
Так как Yii использует Composer в качестве менеджера зависимостей, рекомендуется дополнительно установить его автозагрузчик.
Если вы используете какие-либо сторонние библиотеки, в которых есть свои автозагрузчики, эти автозагрузчики также необходимо
установить.
zxcq544 committed
66

67 68
При использовании дополнительных автозагрузчиков файл `Yii.php` должен быть подключен *после* их установки. Это позволит
автозагрузчику Yii первым пробовать загрузить класс. К примеру, приведённый ниже код взят из
Qiang Xue committed
69
[входного скрипта](structure-entry-scripts.md) [шаблона приложения basic](start-installation.md). Первая строка устанавливает
70
автозагрузчик Composer, а вторая — автозагрузчик Yii:
zxcq544 committed
71 72 73 74 75 76

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

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

80 81
> Информация: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла `Yii.php`
  и подключите его в [входном скрипте](structure-entry-scripts.md).
zxcq544 committed
82 83 84


Автозагрузка классов расширений <a name="autoloading-extension-classes"></a>
85
-------------------------------------------------------------------
zxcq544 committed
86

87 88 89
Автозагрузчик Yii может автоматически загружать классы [расширений](structure-extensions.md) в том случае, если соблюдается
единственное правило. Расширение должно правильно описать раздел 'autoload' в файле 'composer.json'. Более подробно об
этом можно узнать из [официальной документации Composer](https://getcomposer.org/doc/04-schema.md#autoload).
zxcq544 committed
90

91 92
Если вы не используете автозагрузчик Yii, то классы расширений могут быть автоматически загружены с помощью
автозагрузчика Composer.