PHP: Composer и PSR

17 вопросов

1 Что такое Composer?

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/ и генерирует автозагрузчик.

Открыть отдельно →
2 Чем composer.json отличается от composer.lock?

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.

Открыть отдельно →
3 Чем composer install отличается от composer update?

composer install - устанавливает зависимости из composer.lock (точные версии). Если lock-файла нет - ведет себя как update.

composer update - обновляет зависимости до последних допустимых версий (по правилам из composer.json) и перезаписывает lock-файл.

Правило: на CI/CD и проде - только install. На разработке - update при необходимости обновить библиотеки.

Открыть отдельно →
4 Чем require отличается от require-dev?

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-зависимости (экономит место и время).

Открыть отдельно →
5 Следует ли коммитить composer.lock?

Да - для приложений (проектов). Это гарантирует одинаковые версии у всех разработчиков и на проде.

Нет - для библиотек (пакетов, публикуемых на Packagist). Потребители должны сами разрешить зависимости. Lock-файл библиотеки игнорируется при установке через composer require.

Директория vendor/ никогда не коммитится - добавьте в .gitignore.

Открыть отдельно →
6 Что такое семантическое версионирование (semver)?

Semver: MAJOR.MINOR.PATCH (например, 2.3.1)

  • MAJOR - несовместимые изменения API
  • MINOR - обратно совместимый новый функционал
  • PATCH - обратно совместимые исправления ошибок

Операторы в 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 обновления.

Открыть отдельно →
7 Что такое автозагрузка через Composer?
// 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 классов (быстрее).

Открыть отдельно →
8 Что такое packagist?

Packagist (packagist.org) - основной репозиторий PHP-пакетов. Composer по умолчанию ищет пакеты здесь. Содержит 300,000+ пакетов.

Можно использовать приватные репозитории: Private Packagist, Satis, Git-репозиторий напрямую.

// Приватный репозиторий в composer.json
"repositories": [
    { "type": "vcs", "url": "git@github.com:company/private-lib.git" }
]
Открыть отдельно →
9 Что такое composer scripts?
// 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 и др.

Открыть отдельно →
10 Что такое PSR?

PSR (PHP Standard Recommendation) - стандарты PHP, разработанные PHP-FIG (Framework Interop Group). Обеспечивают совместимость между библиотеками и фреймворками.

Ключевые PSR:

  • PSR-1 - базовый стандарт кодирования
  • PSR-4 - автозагрузка
  • PSR-7 - HTTP сообщения
  • PSR-11 - контейнер зависимостей
  • PSR-12 - расширенный стиль кода (заменен PER Coding Style 2.0)
  • PSR-15 - HTTP middleware
  • PSR-18 - HTTP клиент
Открыть отдельно →
11 Что такое PSR-4?

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 = один уровень директории, имя класса = имя файла, регистр важен.

Открыть отдельно →
12 Что такое PSR-7?

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.

Открыть отдельно →
13 Что такое PSR-11?

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-контейнером.

Открыть отдельно →
14 Что такое PSR-12?

PSR-12 (Extended Coding Style) - стандарт оформления кода PHP. Заменен PER Coding Style 2.0. Основные правила:

  • 4 пробела для отступов (не табы)
  • Открывающая скобка класса/метода - на новой строке
  • Открывающая скобка if/for/while - на той же строке
  • Не более одного оператора на строку
  • Строка не длиннее 120 символов
  • use declarations после namespace, перед классом

Инструменты: PHP-CS-Fixer, PHP_CodeSniffer, Laravel Pint.

Открыть отдельно →
15 Что такое PSR-15?

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 - цепочка обработчиков, каждый может изменить запрос/ответ или прервать обработку.

Открыть отдельно →
16 Что такое PSR-18?

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).

Открыть отдельно →
17 Что такое RFC в контексте PHP?

RFC (Request for Comments) - формальное предложение по изменению языка PHP. Процесс:

  1. Автор публикует RFC на wiki.php.net
  2. Обсуждение в mailing list (internals@lists.php.net)
  3. Голосование (минимум 2/3 за для принятия)
  4. Реализация и включение в следующую версию PHP

Примеры: RFC для enum, readonly properties, property hooks. Любой может предложить RFC, но для голосования нужен VCS-аккаунт (обычно core-разработчики).

Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.