17 вопросов
Composer - менеджер зависимостей для PHP (аналог npm/pip/go mod). Решает задачи: установка библиотек, управление версиями, автозагрузка классов.
composer init # создать проект
composer require guzzlehttp/guzzle # добавить зависимость
composer install # установить из composer.lock
composer update # обновить зависимости
composer dump-autoload # перегенерировать автозагрузчикComposer скачивает пакеты из Packagist (packagist.org) в директорию vendor/ и генерирует автозагрузчик.
composer.json - описание проекта и его зависимостей с допустимыми диапазонами версий. composer.lock - зафиксированные точные версии всех зависимостей (включая транзитивные).
// composer.json
"require": {
"guzzlehttp/guzzle": "^7.0" // любая 7.x
}
// composer.lock
"packages": [{
"name": "guzzlehttp/guzzle",
"version": "7.8.1" // точная версия
}]composer install использует lock-файл (воспроизводимая сборка). composer update обновляет lock-файл по правилам из json.
composer install - устанавливает зависимости из composer.lock (точные версии). Если lock-файла нет - ведет себя как update.
composer update - обновляет зависимости до последних допустимых версий (по правилам из composer.json) и перезаписывает lock-файл.
Правило: на CI/CD и проде - только install. На разработке - update при необходимости обновить библиотеки.
require - зависимости для работы приложения (runtime). require-dev - зависимости для разработки и тестирования.
"require": {
"laravel/framework": "^11.0",
"guzzlehttp/guzzle": "^7.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0",
"phpstan/phpstan": "^1.0",
"laravel/pint": "^1.0"
}На проде: composer install --no-dev - не устанавливает dev-зависимости (экономит место и время).
Да - для приложений (проектов). Это гарантирует одинаковые версии у всех разработчиков и на проде.
Нет - для библиотек (пакетов, публикуемых на Packagist). Потребители должны сами разрешить зависимости. Lock-файл библиотеки игнорируется при установке через composer require.
Директория vendor/ никогда не коммитится - добавьте в .gitignore.
Semver: MAJOR.MINOR.PATCH (например, 2.3.1)
Операторы в composer.json:
"^7.0" // >=7.0.0 <8.0.0 (рекомендуется)
"~7.2" // >=7.2.0 <7.3.0
"7.*" // >=7.0.0 <8.0.0
">=7.0" // 7.0 и выше
"7.2.1" // строго 7.2.1^ (caret) - самый безопасный: допускает minor и patch обновления.
// composer.json
"autoload": {
"psr-4": {
"App\\": "src/",
"App\\Tests\\": "tests/"
},
"classmap": ["database/"],
"files": ["src/helpers.php"]
}PSR-4 - маппинг namespace на директорию. App\Models\User ищется в src/Models/User.php.
classmap - сканирует директорию и индексирует все классы. Быстрее PSR-4, но требует dump-autoload при добавлении классов.
files - всегда подключаемые файлы (helpers, functions).
На проде: composer dump-autoload --optimize генерирует classmap для всех PSR-4 классов (быстрее).
Packagist (packagist.org) - основной репозиторий PHP-пакетов. Composer по умолчанию ищет пакеты здесь. Содержит 300,000+ пакетов.
Можно использовать приватные репозитории: Private Packagist, Satis, Git-репозиторий напрямую.
// Приватный репозиторий в composer.json
"repositories": [
{ "type": "vcs", "url": "git@github.com:company/private-lib.git" }
]// composer.json
"scripts": {
"test": "phpunit",
"lint": "phpstan analyse src",
"fix": "php-cs-fixer fix",
"post-install-cmd": ["@auto-scripts"],
"post-update-cmd": ["@auto-scripts"],
"auto-scripts": {
"cache:clear": "symfony-cmd"
}
}
// Запуск
// composer test
// composer lint
// composer fixСкрипты запускаются через composer run-script name или composer name. Хуки: post-install-cmd, post-update-cmd, pre-autoload-dump и др.
PSR (PHP Standard Recommendation) - стандарты PHP, разработанные PHP-FIG (Framework Interop Group). Обеспечивают совместимость между библиотеками и фреймворками.
Ключевые PSR:
PSR-4 - стандарт автозагрузки, определяющий связь namespace с файловой структурой:
// Правило: namespace prefix -> base directory
// App\Models\User -> src/Models/User.php
// composer.json
"autoload": {
"psr-4": { "App\\": "src/" }
}
// Файл: src/Models/User.php
namespace App\Models;
class User { /* ... */ }Правила: одно слово namespace = один уровень директории, имя класса = имя файла, регистр важен.
PSR-7 - стандарт HTTP-сообщений. Определяет интерфейсы для Request, Response, URI, Stream:
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
function handler(ServerRequestInterface $request): ResponseInterface {
$body = $request->getBody()->getContents();
$params = $request->getQueryParams();
$headers = $request->getHeaders();
return new Response(200, ['Content-Type' => 'application/json'], json_encode($data));
}Все объекты PSR-7 иммутабельны - методы-модификаторы возвращают новый объект. Реализации: Guzzle, Laminas Diactoros, Nyholm.
PSR-11 - стандарт контейнера зависимостей:
interface ContainerInterface {
public function get(string $id): mixed;
public function has(string $id): bool;
}
// Использование
$logger = $container->get(LoggerInterface::class);
if ($container->has(CacheInterface::class)) {
$cache = $container->get(CacheInterface::class);
}Реализации: Laravel Service Container, Symfony DI, PHP-DI, League Container. Позволяет библиотекам работать с любым DI-контейнером.
PSR-12 (Extended Coding Style) - стандарт оформления кода PHP. Заменен PER Coding Style 2.0. Основные правила:
Инструменты: PHP-CS-Fixer, PHP_CodeSniffer, Laravel Pint.
PSR-15 - стандарт HTTP middleware:
interface MiddlewareInterface {
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface;
}
class AuthMiddleware implements MiddlewareInterface {
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
if (!$this->isAuthenticated($request)) {
return new Response(401);
}
return $handler->handle($request); // передать дальше
}
}Middleware - цепочка обработчиков, каждый может изменить запрос/ответ или прервать обработку.
PSR-18 - стандарт HTTP-клиента:
interface ClientInterface {
public function sendRequest(RequestInterface $request): ResponseInterface;
}
// Использование (любая реализация: Guzzle, Symfony HttpClient, etc.)
$client = new GuzzleClient();
$request = new Request('GET', 'https://api.example.com/users');
$response = $client->sendRequest($request);
$body = $response->getBody()->getContents();PSR-18 позволяет менять HTTP-клиент без изменения кода приложения. Используется с PSR-7 (messages) и PSR-17 (factories).
RFC (Request for Comments) - формальное предложение по изменению языка PHP. Процесс:
Примеры: RFC для enum, readonly properties, property hooks. Любой может предложить RFC, но для голосования нужен VCS-аккаунт (обычно core-разработчики).