Загрузка...

Сomposer. Директива autoload

Варианты автозагрузки классов и файлов через composer
composer

Автозагрузка

Автозагрузка в php – это механизм последовательного подключения исполняемых php файлов через специальную функцию языка.

Подробнее про автозагрузку можно причитать в  статье Автозагрузка классов в WordPress
В статье приведен практический пример создания простого автозагрзучика с использованием spl_autoload_register().

Как работает автозагрузка с помощью 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

В предыдущем разделе мы рассмотрели, как работает автозагрузка 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 — рекомендуемый способ автозагрузки composer. Вам следует начать использовать его в приложениях, если вы еще этого не сделали!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *