Автозагрузка классов в php с помощью Composer

28 апреля, 2019 14:54
Admin
19 июня, 2022 8:52

Благодаря появлению такого инструмента как 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.

Важно отметить, что psr-4 необходимо писать именно в нижнем регистре, поскольку composer проигнорирует строку, если указать PSR-4 в верхнем регистре.

После того, как в 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 по следующей ссылке.