Автозагрузка файлов с помощью composer

Автозагрузка файлов с помощью composer

Для чего нужна автозагрузка?

При создании приложений 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 предоставляет четыре различных метода автозагрузки файлов:

  1. Автозагрузка файлов
  2. Автозагрузка карты классов
  3. PSR-0 автозагрузка
  4. 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.