Благодаря появлению такого инструмента как composer, в нашем распоряжении появился универсальный инструмент автозагрузки. Теперь, чтобы написать свою библиотеку или приложение, нет необходимости писать свой автозагрузчик классов, и поэтому можно сосредоточиться на написании кода вашего приложения. Более того, в нашем распоряжении появился универсальный инструмент подключение сторонних библиотек, если в этом есть необходимость. В данной статье мы рассмотрим, как осуществить автозагрузку классов с помощью автозагрузчика composer в соответствии с PSR-4.
Организация структуры приложения
Ранее написание автозагрузчика классов осуществлялось с помощью PHP функции spl_autoload_register, и каждый сам организовывал структуру приложения в соответствии с придуманным им правилами. Для того, чтобы все разработчики придерживались предопределенных правил и не придумывали свои, сообщество PHP разработчиков написали рекомендации (стандарты) PSR-0 и PSR-4, которые позволят всем PHP программистам организовывать структуру таким образом, чтобы их приложение было проще понимать другим. Мы будем писать автозагрузку в соответствии с PSR-4, поскольку это более актуальный и рекомендуемый на данный момент способ организации структуры.
Следуя PSR-4, мы называем файлы нашего приложения в соответствии с названием класса, а пространствами имен будут служить название папок. Предположим, мы сделаем следующую структуру папок и файлов:
└── src
└── Kernel
└── Application.php
└── Validator
└── BaseValidator.php
├── FormValidator.php
├── index.php
Исходя из данной структуры, мы можем сделать вывод, что входной точкой будет служить файл index.php, а все файлы приложения мы будем размещать в папке src. Предположим, что наш проект будет называться EffectingValidator, тогда начальным пространством имен будет служить наше название EffectingValidator. Поэтому пространства имен и содержимое в наших файлах (Application.php, BaseValidator.php, FormValidator.php) будет иметь следующий вид:
файл Application.php:
<?php
namespace EffectingValidator\Kernel;
class Application
{
// код класса
}
файл BaseValidator.php:
<?php
namespace EffectingValidator\Validator;
abstract class BaseValidator
{
// код класса
}
файл FormValidator.php:
<?php
namespace EffectingValidator\Validator;
class FormValidator extends BaseValidator
{
// код класса
}
Сам PHP не требует от нас, чтобы имя класса совпадало с именем файла, а имя пространства имен - с именами папок. PSR-4 это всего лишь договоренность, чтобы все разработчики использовали общий стандарт.
Заполняем файл composer.json
После того, как наша структура готова, нам необходимо уведомить composer о том, откуда и как ему осуществлять загрузку ваших классов. Если у вас еще нет файла composer.json в корне вашего проекта (рядом с файлом index.php в нашем случае), самое время его создать и добавить примерно следующее содержимое:
{
"name": "effecting-validator/app",
"description" : "description",
"authors": [
{
"name": "My name",
"email": "admin@example.com"
}
],
"autoload": {
"psr-4": {"EffectingValidator\\": "src/"}
}
}
Здесь больше всего нас интересует строка autoload, где указывается откуда composer должен загружать наши классы. В нашем случае мы сообщаем, что классы нашего проекта необходимо искать в папке src.
После того, как в composer.json добавлена вся необходимая информация нужно выполнить команду: php composer.phar dump-autoload или composer dump-autoload в зависимости от того, глобально или локально у вас установлен composer (более подробно про установку composer можно прочитать здесь).
Теперь все, что осталось для того, чтобы использовать наши классы - это добавить следующую строку в файл index.php: require __DIR__ . '/vendor/autoload.php';
Автозагрузка классов с помощью composer завершена, и нам нет необходимости писать собственную автозагрузку. Более того, большинство современных библиотек и PHP фреймворков написаны в соответствии с PSR-4 и с помощью автозагрузчика composer, поэтому если у вас есть необходимость использовать сторонние библиотеки, которые используют composer, то вам достаточно лишь указать нужную библиотеку в секции require файла composer.json, например следующим образом:
"require": {
"guzzlehttp/guzzle": "6.3.3"
},
Composer сам скачает и подключит указанную библиотеку, а вам останется лишь использовать все ее возможности в вашем проекте.
Исходный код описанного в данной статье примера можно найти на bitbucket по следующей ссылке.