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

Ответ

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-совместимый логгер или даже заглушку.

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

Ответ 18+ 🔞

Ну слушай, вот есть у нас в PHP такая штука — PSR. Это, блядь, не просто какие-то бумажки, а реальные правила игры, чтобы код из разных углов мог друг с другом общаться без ругани и подзатыльников. PHP-FIG их выдумали, чтобы мы все не изобретали свои велосипеды на квадратных колёсах. Я основные юзаю, сейчас разжую.

1. PSR-4: Автозагрузчик (Тот самый, без которого нихуя не работает)

  • Суть: Чтобы не писать эти ёбаные require_once на каждом шагу. Связывает пространство имён класса с путём к файлу. Магия, но стандартизированная.
  • Как: Класс VendorPackageClassName автоматом ищется в vendor/package/src/ClassName.php.
  • Пример в composer.json (тут без вариантов):
    {
        "autoload": {
            "psr-4": {
                "MyApp\": "src/"
            }
        }
    }

    Значит, файл src/Controller/UserController.php будет классом MyAppControllerUserController. И никакого геморроя.

2. PSR-12: Стиль кода (Чисто чтобы не убивать друг друга при code review)

  • Суть: Жёсткие правила, как расставлять пробелы, скобки и прочую хуету. Преемник старого PSR-2, просто ещё дохуя деталей добавили.
  • Зачем: Чтобы весь код в проекте выглядел так, будто его один человек писал. А то бывает — открываешь файл, а там дичь, волосы дыбом, терпения ноль ебать. Использую PHP-CS-Fixer, чтобы он автоматом всё подравнивал, мне не царское это дело — пробелы считать.
  • Основное: 4 пробела (табы — нахуй), фигурные скобки на новой строке, строгие правила для use и операторов.

3. PSR-7: HTTP-сообщения (Основа всего веба, если честно)

  • Суть: Интерфейсы для запроса и ответа. Абстракция, ёпта!
  • Почему охуенно: Пишешь 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: Контейнер (Чтобы не зависеть от конкретной бандуры)

  • Суть: Стандартный интерфейс для контейнера зависимостей (ContainerInterface).
  • В чём соль: Твоя библиотека говорит: «дайте мне сюда PSR-11 контейнер», а там внутри у пользователя может быть Symfony DI, PHP-DI или даже его собственная манда с ушами. Тебе да похуй. Главное — интерфейс.

5. PSR-3: Логгер (Чтобы не привязываться к Monolog намертво)

  • Суть: Общий интерфейс для логирования.
  • Как юзаю: В своём коде требую PsrLogLoggerInterface. А пользователь уже может запихнуть туда Monolog, свой логгер, который пишет в телегу, или просто заглушку. Гибко, как хитрая жопа.

Короче, если в проекте есть эти PSR — это признак, что там работали не школьники, а люди, которые понимают, что такое поддерживаемый код. Без этого — пиздопроебибна получается, а не архитектура.