Ответ
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 — это признак, что там работали не школьники, а люди, которые понимают, что такое поддерживаемый код. Без этого — пиздопроебибна получается, а не архитектура.