Автозагрузчик Composer
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 13 из 91.
Написание собственного автозагрузчика работает, но реальные PHP-проекты используют Composer для автоматической обработки автозагрузки. Composer считывает конфигурацию вашего проекта и генерирует оптимизированный автозагрузчик, который соответствует стандартам PSR-4.
Конфигурация находится в файле composer.json в корне вашего проекта. Вот как вы определяете правила автозагрузки:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Это сообщает Composer, что любой класс, начинающийся с App\, должен загружаться из директории src/. После настройки Composer генерирует файлы автозагрузчика в директории vendor/.
Чтобы использовать автозагрузчик Composer, вам нужна всего одна строка в начале вашего входного файла:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Этот единственный оператор require обрабатывает всю загрузку классов для всего вашего проекта. При необходимости вы можете определить несколько сопоставлений пространств имен:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Ключевой момент: Автозагрузчик Composer устраняет необходимость ручного подключения файлов и обеспечивает согласованную загрузку классов во всем проекте. Это стандартный подход, используемый практически всеми современными PHP-приложениями и фреймворками.
Задание
ЛегкоДавайте создадим небольшое приложение, которое использует подход автозагрузки Composer для организации классов в нескольких файлах. Вы смоделируете, как реальный PHP-проект структурирует свой код с использованием пространств имен PSR-4 и центрального автозагрузчика.
Вы создадите четыре файла, которые работают вместе:
src/Models/Product.php— Определите классProductв пространстве именApp\Models. У него должны быть свойстваpublic $nameиpublic $price, конструктор, который принимает и устанавливает оба значения, и методgetInfo(), который возвращает"[name]: $[price]".src/Models/Customer.php— Определите классCustomerв пространстве именApp\Models. У него должно быть свойствоpublic $name, конструктор, который принимает и устанавливает имя, и методgreet(), который возвращает"Welcome, [name]!".vendor/autoload.php— Создайте простой автозагрузчик, используяspl_autoload_register, который имитирует поведение Composer. Он должен сопоставлять префикс пространства именApp\с директориейsrc/, преобразуя разделители пространств имен в разделители директорий и добавляя.phpдля загрузки соответствующего файла.index.php— Это ваш файл точки входа. Подключите автозагрузчик изvendor/autoload.phpодной строкой, затем используйте ключевое словоuseдля импорта какApp\Models\Product, так иApp\Models\Customer. Создайте объектProductс именем"Laptop"и ценой999, а также объектCustomerс именем"Alice". Выведите результат вызоваgreet()для клиента иgetInfo()для продукта (каждый на новой строке).
Ключевая концепция здесь заключается в том, что вашему index.php требуется только один оператор require для загрузки автозагрузчика — после этого все классы загружаются автоматически при их использовании. Именно так работают современные PHP-фреймворки и приложения с Composer.
Шпаргалка
Composer автоматизирует загрузку классов, считывая конфигурационный файл composer.json и создавая оптимизированный автозагрузчик, соответствующий стандартам PSR-4.
Определите правила автозагрузки в composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Это сопоставляет пространство имен App\ с директорией src/. Composer генерирует файлы автозагрузчика в директории vendor/.
Используйте автозагрузчик Composer с помощью одной инструкции require:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
При необходимости определите несколько сопоставлений пространств имен:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Автозагрузчик Composer избавляет от ручного подключения файлов и является стандартным подходом в современных PHP-приложениях.
Попробуйте сами
<?php
// TODO: Подключите автозагрузчик из vendor/autoload.php
// TODO: Используйте ключевое слово 'use' для импорта App\Models\Product
// TODO: Используйте ключевое слово 'use' для импорта App\Models\Customer
// TODO: Создайте Product с именем "Laptop" и ценой 999
// TODO: Создайте Customer с именем "Alice"
// TODO: Выведите результат greet() клиента
// TODO: Выведите результат getInfo() продукта
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy