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

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

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

При создании приложений PHP вам может потребоваться использование сторонних библиотек. И, как вы знаете, если вы хотите использовать эти библиотеки в своем приложении, необходимо включить их в исходные файлы с помощью операторов require или include.

Эти операторы хороши, если вы разрабатываете небольшие приложения. Но по мере роста приложения список операторов require или include становится все длиннее и длиннее, что немного раздражает, и это сложно поддерживать. Другая проблема с этим подходом заключается в том, что вы загружаете в приложение библиотеки полностью, включая части, которые вы даже не используете. Это приводит к увеличению объема памяти для вашего приложения.

Чтобы решить эту проблему, было бы идеально загружать классы только тогда, когда они действительно необходимы. Вот здесь и вступает в игру автозагрузка. Обычно, когда вы используете класс в приложении, автозагрузчик проверяет, загружен ли он уже, а если нет, автозагрузчик загружает необходимый класс в память. Таким образом, класс загружается «на лету» туда, где это необходимо — это называется автозагрузкой. Когда вы используете автозагрузку, вам не нужно вручную включать все файлы библиотеки; вам просто нужно включить файл автозагрузчика, который содержит логику автозагрузки, и необходимые классы будут включены динамически.

Позже в этой статье мы рассмотрим автозагрузку с помощью Composer. Но сначала я объясню, как можно реализовать автозагрузку в PHP без Composer.

Как работает автозагрузка без Composer

Вы можете этого не осознавать, но в PHP можно реализовать автозагрузку без Composer. Функция spl_autoload_register() делает это возможным. Функция spl_autoload_register() позволяет регистрировать функции , которые будут введены в очередь, чтобы запускать их последовательно, когда PHP пытается загрузить классы, которые еще не загружены. Давайте быстро рассмотрим следующий пример, чтобы понять, как это работает.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
function custom_autoloader($class) {
include 'lib/' . $class . '.php';
}
spl_autoload_register('custom_autoloader');
$objFooBar = new FooBar();
?>
<?php function custom_autoloader($class) { include 'lib/' . $class . '.php'; } spl_autoload_register('custom_autoloader'); $objFooBar = new FooBar(); ?>
<?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, как показано в следующем фрагменте.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require 'vendor/autoload.php';
// code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file
?>
<?php require 'vendor/autoload.php'; // code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file ?>
<?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, как показано в следующем фрагменте:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace rsgrinko\Library;
class Foo
{
//...
}
?>
<?php namespace rsgrinko\Library; class Foo { //... } ?>
<?php
namespace rsgrinko\Library;
 
class Foo 
{
    //...
}
?>

Как видите, этот класс определен в пространстве имен rsgrinko\Library. Также имя файла соответствует имени класса. Давайте быстро рассмотрим, как можно загрузить класс Foo автоматически.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require 'vendor/autoload.php';
$objFoo = new rsgrinko\Library\Foo();
?>
<?php require 'vendor/autoload.php'; $objFoo = new 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.