Автозагрузчик Composer
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 13 из 91.
Создание собственного autoloader работает, но реальные проекты на PHP используют Composer, чтобы автоматически обрабатывать autoloading. Composer читает конфигурацию вашего проекта и создаёт оптимизированный autoloader, соответствующий стандартам PSR-4.
Конфигурация находится в файле composer.json в корне вашего проекта. Вот как определить правила autoloading:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Это сообщает Composer, что любой class, начинающийся с App\, следует загружать из директории src/. После настройки Composer создаёт файлы autoloader в директории vendor/.
Чтобы использовать autoloader Composer, нужна всего одна строка в начале входного файла:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Этот единственный оператор require обрабатывает загрузку всех class во всём вашем проекте. При необходимости можно определить несколько сопоставлений namespace:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Ключевой момент: автозагрузчик Composer устраняет необходимость в ручном подключении file и обеспечивает единообразную загрузку class во всём вашем проекте. Это стандартный подход, используемый практически всеми современными приложениями и фреймворками на PHP.
Задание
ЛегкоДавайте создадим небольшое приложение, использующее подход Composer к autoloading для организации class в нескольких file. Вы смоделируете структуру кода реального PHP-проекта с namespace PSR-4 и центральным autoloader.
Вы создадите четыре file, которые работают вместе:
src/Models/Product.php: ОпределитеProductclass в namespaceApp\Models. У него должны быть propertiespublic $nameиpublic $price, constructor, который accepts и устанавливает оба значения, а также methodgetInfo(), который returns"[name]: $[price]".src/Models/Customer.php: ОпределитеCustomerclass в namespaceApp\Models. У него должна быть propertypublic $name, constructor, который accepts и устанавливает имя, а также methodgreet(), который returns"Welcome, [name]!".vendor/autoload.php: Создайте простой autoloader с помощьюspl_autoload_register, имитирующий поведение Composer. Он должен сопоставлять prefix namespaceApp\с directorysrc/, преобразовывать separators namespace в separators directory и добавлять.php, чтобы загрузить нужный file.index.php: Это ваш entry point file. Одной строкой выполните Require autoloader изvendor/autoload.php, затем используйте keyworduse, чтобы импортировать оба класса:App\Models\ProductиApp\Models\Customer. СоздайтеProductс именем"Laptop"и ценой999, а такжеCustomerс именем"Alice". Print result вызоваgreet()у customer иgetInfo()у product (каждый на отдельной строке).
Ключевая концепция здесь заключается в том, что вашему index.php нужна только одна инструкция require для загрузки autoloader; после этого все class загружаются автоматически, когда вы их используете. Именно так современные PHP-фреймворки и приложения работают с Composer.
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP