Для чего нужна автозагрузка?
При создании приложений PHP вам может потребоваться использование сторонних библиотек. И, как вы знаете, если вы хотите использовать эти библиотеки в своем приложении, необходимо включить их в исходные файлы с помощью операторов require или include.
Эти операторы хороши, если вы разрабатываете небольшие приложения. Но по мере роста приложения список операторов require или include становится все длиннее и длиннее, что немного раздражает, и это сложно поддерживать. Другая проблема с этим подходом заключается в том, что вы загружаете в приложение библиотеки полностью, включая части, которые вы даже не используете. Это приводит к увеличению объема памяти для вашего приложения.
Чтобы решить эту проблему, было бы идеально загружать классы только тогда, когда они действительно необходимы. Вот здесь и вступает в игру автозагрузка. Обычно, когда вы используете класс в приложении, автозагрузчик проверяет, загружен ли он уже, а если нет, автозагрузчик загружает необходимый класс в память. Таким образом, класс загружается «на лету» туда, где это необходимо — это называется автозагрузкой. Когда вы используете автозагрузку, вам не нужно вручную включать все файлы библиотеки; вам просто нужно включить файл автозагрузчика, который содержит логику автозагрузки, и необходимые классы будут включены динамически.
Позже в этой статье мы рассмотрим автозагрузку с помощью Composer. Но сначала я объясню, как можно реализовать автозагрузку в PHP без Composer.
Как работает автозагрузка без Composer
Вы можете этого не осознавать, но в PHP можно реализовать автозагрузку без Composer. Функция spl_autoload_register() делает это возможным. Функция spl_autoload_register() позволяет регистрировать функции , которые будут введены в очередь, чтобы запускать их последовательно, когда PHP пытается загрузить классы, которые еще не загружены. Давайте быстро рассмотрим следующий пример, чтобы понять, как это работает.
<?php function custom_autoloader($class) { include 'lib/' . $class . '.php'; } spl_autoload_register('custom_autoloader'); $objFooBar = new FooBar(); ?>
В приведенном выше примере мы с помощью функции spl_autoload_register() зарегистрировали функцию custom_autoloader(), как пользовательский автозагрузчик. Затем, когда вы пытаетесь создать экземпляр класса FooBar, а он еще не доступен, PHP последовательно выполнит все зарегистрированные функции автозагрузчика. Таким образом вызывается функция custom_autoloader — она включает в себя необходимый файл класса, и, наконец, создается экземпляр объекта. В этом примере мы предполагаем, что класс FooBar определен в файле lib / FooBar.php.
Без автозагрузки вам нужно будет использовать оператор require или include для включения файла класса FooBar. Реализация автозагрузчика в приведенном выше примере довольно проста, но вы можете развить ее, зарегистрировав несколько автозагрузчиков для разных типов классов.
Однако на практике вы не часто будете писать свой собственный автозагрузчик. Для этого и нужен Composer! Далее мы рассмотрим, как использовать Composer для автозагрузки в PHP.
Как работает автозагрузка с помощью Composer
Во-первых, не забудьте установить Composer в системе, если хотите следовать примерам. Когда дело доходит до автозагрузки с помощью 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 с Composer
В предыдущем разделе мы рассмотрели, как работает автозагрузка 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 дает гораздо более простую структуру каталогов, поскольку вы можете не создавать вложенные каталоги, но при этом использовать полные пространства имен.
PSR-4 — рекомендуемый способ автозагрузки, широко принятый в сообществе PHP. Вам следует начать использовать его в приложениях, если вы еще этого не сделали!
Заключение
Сегодня мы рассмотрели автозагрузку в PHP. Начиная с введения различных методов автозагрузки Composer, во второй половине статьи мы подробно описали стандарты автозагрузки PSR-0 и PSR-4.