Автозагрузка
Автозагрузка в php – это механизм последовательного подключения исполняемых php файлов через специальную функцию языка.
Подробнее про автозагрузку можно причитать в статье Автозагрузка классов в WordPress
В статье приведен практический пример создания простого автозагрзучика с использованием spl_autoload_register()
.
Как работает автозагрузка с помощью Composer
Composer предоставляет четыре варианта автозагрузки файлов:
- Автозагрузка файлов
- Автозагрузка карты классов
- PSR-0 автозагрузка
- PSR-4 автозагрузка
Согласно официальной документации Composer, PSR-4 является рекомендуемым способом автозагрузки, и мы подробно рассмотрим его в следующем разделе. В этом разделе мы кратко обсудим остальные три варианта.
Прежде чем мы продолжим, давайте быстро опишем шаги, которые вам необходимо выполнить, если вы хотите использовать автозагрузку Composer.
- Определите файл
composer.json
в корне проекта или библиотеки. Он должен содержать директивы, основанные на типе автозагрузки. - Запустите команду composer
dump-autoload
, чтобы сгенерировать необходимые файлы, которые Composer будет использовать для автозагрузки. - Включите инструкцию
require ‘vendor/autoload.php’
в верхней части файла, в котором вы хотите использовать автозагрузку.
Директива files
Автозагрузка файлов работает аналогично операторам include или require, которые позволяют загружать исходные файлы целиком. Все исходные файлы, на которые есть ссылка в директиве files
, будут загружаться при каждом запуске приложения. Это полезно для загрузки исходных файлов, в которых не используются классы.
Чтобы использовать автозагрузку файлов, укажите список файлов в директиве files
файла composer.json
, как показано в следующем фрагменте.
{
"autoload": {
"files": ["lib/Foo.php", "lib/Bar.php"]
}
}
Как видите, в директиве files мы можем предоставить список файлов, которые мы хотим автоматически загрузить с помощью Composer. После того, как вы создадите файл composer.json
в корне проекта с указанным выше содержимым, вам просто нужно запустить команду composer dump-autoload
для создания необходимых файлов автозагрузчика. Они будут созданы в каталоге vendor. Наконец, вам необходимо включить инструкцию require ‘vendor/autoload.php’
в верхней части файла, в который вы хотите автоматически загружать файлы с помощью Composer, как показано в следующем фрагменте.
<?php
require 'vendor/autoload.php';
// code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file
?>
Объявление require ‘vendor/autoload.php’
обеспечивается, чтобы необходимые файлы загружались динамически.
Директива classmap
Автозагрузка карты классов — это улучшенная версия автозагрузки файлов. Вам просто нужно предоставить список каталогов, и Composer просканирует все файлы в этих каталогах. Для каждого файла Composer составляет список классов, содержащихся в этом файле, и всякий раз, когда требуется один из этих классов, Composer автоматически загружает соответствующий файл.
Давайте быстро пересмотрим файл composer.json, чтобы продемонстрировать автозагрузчик карты классов.
{
"autoload": {
"classmap": "lib"
}
}
Запустите команду composer dump-autoload
, и Composer прочитает файлы в каталоге lib, чтобы создать карту классов, которые можно загрузить автоматически.
Директива PSR-0
PSR-0 — это стандарт, рекомендованный группой PHP-FIG для автозагрузки. В стандарте PSR-0 вы должны использовать пространства имен для определения библиотек. Полное имя класса должно отражать структуру \<Vendor Name>\(<Namespace>\)*<Class Name>
. Кроме того, классы должны быть сохранены в файлах, имеющих ту же структуру каталогов, что и у пространств имен.
Давайте рассмотрим следующий файл composer.json
.
{
"autoload": {
"psr-0": {
"rsgrinko\Library": "src"
}
}
}
При автозагрузке PSR-0 вам необходимо сопоставить пространства имен с каталогами. В приведенном выше примере мы говорим Composer, что все, что начинается с пространства имен rsgrinko\Library
, должно быть доступно в каталоге src\rsgrinko\Library
.
Например, если вы хотите определить класс Foo в каталоге src\rsgrinko\Library
, вам необходимо создать файл src\rsgrinko\Library\Foo.php
, как показано в следующем фрагменте:
<?php
namespace rsgrinko\Library;
class Foo
{
//...
}
?>
Как видите, этот класс определен в пространстве имен rsgrinko\Library
. Также имя файла соответствует имени класса. Давайте быстро рассмотрим, как можно загрузить класс Foo автоматически.
<?php
require 'vendor/autoload.php';
$objFoo = new rsgrinko\Library\Foo();
?>
Composer автоматически загрузит класс Foo
из каталога src\rsgrinko\Library
. Итак, это было краткое объяснение автозагрузки файлов, классов и PSR-0 в Composer. В следующем разделе мы рассмотрим, как работает автозагрузка PSR-4.
Директива PSR-4
В предыдущем разделе мы рассмотрели, как работает автозагрузка PSR-0. PSR-4 похож на автозагрузку PSR-0 в том, что вам нужно использовать пространства имен, но вам не нужно имитировать структуру каталогов с помощью пространствами имен.
При автозагрузке PSR-0 вы должны сопоставить пространства имен со структурой каталогов. Как мы рассмотрели в предыдущем разделе, если вы хотите автоматически загрузить класс rsgrinko\Library\Foo
, он должен находиться в src\rsgrinko\Library\Foo.php
. При автозагрузке PSR-4 вы можете сократить структуру каталогов, что приводит к гораздо более простой структуре каталогов по сравнению с автозагрузкой PSR-0.
Мы пересмотрим приведенный выше пример — заметите ли вы различия? Вот как выглядит файл composer.json с автозагрузкой PSR-4.
{
"autoload": {
"psr-4": {
"rsgrinko\Library\": "src"
}
}
}
Важно отметить, что мы добавили обратную косую черту в конце пространств имен. Приведенное выше отображение сообщает Composer, что все, что начинается с пространства имен rsgrinko\Library
, должно быть доступно в каталоге src. Таким образом, вам не нужно создавать каталоги rsgrinko и Library. Например, если вы запрашиваете класс rsgrinko\Library\Foo
, Composer попытается загрузить файл src\Foo.php
.
Важно понимать, что класс Foo по-прежнему определен в пространстве имен rsgrinko\Library;
просто вам не нужно создавать каталоги, имитирующие пространства имен. Содержимое файла src\foo.php
будет совпадать с содержимым файла src\rsgrinko\Library\Foo.php
из предыдущего раздела.
Как видите, PSR-4 дает гораздо более простую структуру каталогов, поскольку вы можете не создавать вложенные каталоги, но при этом использовать полные пространства имен.