Какие стандарты PSR вы знаете и для чего они используются?

«Какие стандарты PSR вы знаете и для чего они используются?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PSR (PHP Standards Recommendation) — это спецификации от PHP-FIG, которые унифицируют разработку на PHP, чтобы код из разных фреймворков и библиотек мог легче взаимодействовать. Вот ключевые стандарты, которые я использую:

1. PSR-4: Autoloader

  • Для чего: Стандарт автозагрузки классов через пространства имен. Это основа современного PHP-проекта.
  • Как работает: Соответствие между пространством имен VendorPackageClassName и путем к файлу vendor/package/src/ClassName.php.
  • Пример из composer.json:
    {
        "autoload": {
            "psr-4": {
                "MyApp\": "src/"
            }
        }
    }

    Файл src/Controller/UserController.php будет содержать класс MyAppControllerUserController.

2. PSR-12: Extended Coding Style

  • Для чего: Детальное руководство по форматированию кода (преемник PSR-2). Использую вместе с инструментами вроде PHP_CodeSniffer или PHP-CS-Fixer для автоматического применения.
  • Основные правила:
    • 4 пробела на отступ.
    • Фигурная скобка класса/метода на новой строке.
    • Строгие правила для use-объявлений, операторов, длины строки.

3. PSR-7: HTTP Message Interface

  • Для чего: Определяет интерфейсы для HTTP-запросов и ответов (PsrHttpMessageRequestInterface, ResponseInterface).
  • Почему важно: Позволяет писать middleware и компоненты, не зависящие от конкретной реализации (например, от Slim, Guzzle, Laminas).
  • Пример создания ответа (с использованием Diactoros):
    $response = new LaminasDiactorosResponse();
    $response->getBody()->write('Hello World');
    return $response->withStatus(200)->withHeader('Content-Type', 'text/plain');

4. PSR-11: Container Interface

  • Для чего: Стандартизирует интерфейс контейнера внедрения зависимостей (PsrContainerContainerInterface).
  • Почему: Позволяет библиотекам зависеть от абстракции контейнера, а не от конкретной реализации (Symfony DI, PHP-DI, Aura.Di).

5. PSR-3: Logger Interface

  • Для чего: Общий интерфейс для логгеров. В своем коде я завишу от PsrLogLoggerInterface, а пользователь может подставить Monolog, любой другой PSR-3-совместимый логгер или даже заглушку.

Использование этих стандартов — признак зрелого проекта, который легко поддерживать и расширять.