Composer это менеджер пакетов для PHP. Выполните composer require vendor/package в папке проекта: Composer скачает библиотеку в vendor/, запишет её в composer.json, а подключить её вместе со всем остальным установленным можно одной строкой, require __DIR__ . '/vendor/autoload.php';.
composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);
Никаких include для каждого файла: автозагрузчик загружает Logger, StreamHandler и всё, что они используют, когда каждый класс понадобится впервые. Пакеты берутся с Packagist, публичного реестра, где Composer ищет по умолчанию.
Установка Composer
Сначала Composer нужен PHP на вашем компьютере (смотрите установку PHP).
Windows: скачайте и запустите Composer-Setup.exe с getcomposer.org. Он найдёт ваш php.exe и добавит composer в PATH. После этого откройте новый терминал.
macOS с Homebrew:
brew install composer
Linux: пакет вашего дистрибутива (sudo apt install composer в Debian и Ubuntu) работает, но часто это старый выпуск. Официальный установщик даёт актуальный:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
На странице загрузки на getcomposer.org есть ещё строка, которая проверяет хеш установщика перед запуском; копируйте команды оттуда, чтобы получить актуальный хеш. Затем проверьте, что всё работает:
composer --version
composer.json и composer.lock
composer init задаёт несколько вопросов и записывает composer.json, либо composer require создаёт его при первом пакете. Типичный файл:
{
"name": "acme/shop",
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.0",
"vlucas/phpdotenv": "^5.6"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
requireперечисляет то, что нужно проекту для работы, включая версию PHP.require-devперечисляет инструменты только для разработки (тесты, статический анализ).composer require --dev phpunit/phpunitдобавляет в этот раздел, аcomposer install --no-devпропускает его на продакшен-серверах.autoloadсообщает Composer, где лежат ваши собственные классы (ниже).
Рядом Composer записывает composer.lock с точной версией каждого установленного пакета, включая пакеты, от которых зависят ваши пакеты. Коммитьте оба файла. Не коммитьте vendor/: добавьте её в .gitignore, потому что composer install восстанавливает её по lock-файлу.
composer install и composer update
composer install # install exactly what composer.lock says
composer update # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog # update one package only
composer remove monolog/monolog # uninstall and remove from composer.json
composer outdated # list packages with newer versions available
Запускайте composer install после клонирования проекта и при каждом деплое: все получают те же версии, которые проверялись. Запускайте composer update, только когда намерены обновиться, затем тестируйте и коммитьте новый composer.lock. Запуск update на продакшен-сервере устанавливает версии, которые никто не проверял.
Ограничения версий: ^ и ~
| Ограничение | Разрешает | Для чего |
|---|---|---|
^3.2 | от 3.2.0 до 4.0.0, не включая её | Обычный выбор: возможности и исправления без ломающей мажорной версии |
^0.4 | от 0.4.0 до 0.5.0, не включая её | Пакеты до 1.0, где минорные версии могут ломать совместимость |
~3.2 | от 3.2.0 до 4.0.0, не включая её | То же, что ^3.2 |
~3.2.1 | от 3.2.1 до 3.3.0, не включая её | Только исправления |
3.2.1 | Ровно 3.2.1 | Редко; это блокирует исправления безопасности |
>=3.2 <3.5 | Свой диапазон | Обход сломанного выпуска |
composer require vendor/package без версии выбирает самый новый стабильный выпуск и записывает для него ограничение ^, и обычно именно это и нужно.
Автозагрузка своих классов через PSR-4
PSR-4 это соглашение, которое сопоставляет пространство имён с папкой: с "App\\": "src/" класс App\Text\Slug лежит в src/Text/Slug.php. После добавления раздела autoload выполните:
composer dump-autoload
Автозагрузчик Composer это функция, зарегистрированная через spl_autoload_register(), которую PHP вызывает всякий раз, когда код использует ещё не загруженный класс. Этот блок записывает два файла классов и регистрирует собственный небольшой автозагрузчик PSR-4, чтобы было видно, как работает сопоставление. Добавьте третий файл класса и используйте его.
Автозагрузчик срабатывает один раз на класс: второй вызов Slug::from() не печатает строку autoload:, потому что класс уже загружен. В реальном проекте эту функцию сами никогда не пишут; vendor/autoload.php регистрирует версию Composer, которая обрабатывает и пакеты в vendor/. Пространства имён описаны на странице о пространствах имён.
Частые ошибки
Class "Monolog\Logger" not found. Скрипт не сделалrequire 'vendor/autoload.php', или путь неверен. Используйте__DIR__ . '/vendor/autoload.php', чтобы путь не зависел от текущего каталога.- Свой класс не находится после добавления в
autoload. Выполнитеcomposer dump-autoloadи проверьте, что путь к файлу точно совпадает с пространством имён, включая регистр букв:App\Text\Slugдолжен лежать вsrc/Text/Slug.php, а серверы на Linux считаютsrc/text/slug.phpдругим файлом. Your requirements could not be resolved to an installable set of packages. Двум пакетам нужны несовместимые версии чего-то, часто самого PHP. Сообщение перечисляет конфликт;composer why-not vendor/package 2.0объясняет, что блокирует версию.composerне распознаётся. Терминал был открыт до установки, или папки нет в PATH. Откройте новый терминал или вызывайтеphp composer.pharнапрямую.
Часто задаваемые вопросы
Чем composer install отличается от composer update?
composer install устанавливает ровно те версии, которые записаны в composer.lock, поэтому на каждой машине оказывается одинаковый код; запускайте её после клонирования и при деплое. composer update подбирает самые новые версии, разрешённые composer.json, устанавливает их и перезаписывает composer.lock; запускайте её, когда собираетесь обновиться.
Нужно ли коммитить composer.lock и папку vendor?
Для приложений коммитьте composer.lock, чтобы все устанавливали одни и те же версии. Не коммитьте vendor/: добавьте её в .gitignore и дайте composer install создать её заново.
Что означает ^ в composer.json?
^2.3 разрешает любую версию от 2.3.0 и до 3.0.0, не включая её: новые возможности и исправления, но не новую мажорную версию, которая может сломать ваш код. ~2.3 означает то же, а ~2.3.1 разрешает только 2.3.x начиная с 2.3.1.
Как автоматически загружать свои классы через Composer?
Добавьте "autoload": {"psr-4": {"App\\": "src/"}} в composer.json, выполните composer dump-autoload и сделайте require 'vendor/autoload.php'. Тогда класс App\Mail\Mailer загружается из src/Mail/Mailer.php при первом использовании.
Как узнать, какая версия Composer установлена?
Выполните composer --version. Чтобы обновить сам Composer, выполните composer self-update или обновите его через менеджер пакетов, которым вы его ставили, например brew upgrade composer.