← Назад к вопросам

Что такое PSR?

1.0 Junior🔥 111 комментариев
#Composer и PSR#PHP Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# PSR - PHP Standards Recommendations

PSR - это рекомендации по стандартизации PHP кода, разработанные PHP-FIG (Framework Interoperability Group). Это набор соглашений, которые делают код более единообразным и совместимым между проектами.

Что такое PHP-FIG?

PHP Framework Interoperability Group - группа разработчиков из популярных фреймворков (Laravel, Symfony, Zend, Drupal и т.д.), которые определяют стандарты. Их целе - совместимость между фреймворками.

Основные PSR стандарты

PSR-1: Basic Coding Standard

Базовые правила кодирования:

// ✅ Правильно
<?php

namespace MyApp\Users;

class UserController {
    public function showUser($id) {
        // ...
    }
}

// ❌ Неправильно
<?php
function ShowUser($id) {  // Функции snake_case
    // ...
}
class user {  // Классы PascalCase
    // ...
}

Правила:

  • <?php открывающий тег
  • UTF-8 без BOM
  • Классы: PascalCase
  • Методы: camelCase
  • Константы: CONSTANT_CASE
  • Пробелы вместо табов (4 пробела)

PSR-2: Coding Style Guide

Расширение PSR-1 с деталями стиля:

// Код должен следовать PSR-1 и добавлять:

// 1. Отступы в 4 пробела
class User {
    public function getName() {
        if ($this->name) {
            return $this->name;  // 4 пробела
        }
    }
}

// 2. Скобки на новой строке для функций
function myFunction()
{  // На новой строке
    // ...
}

// 3. Скобки на ОДНОЙ строке для if/for/while
if ($x > 0) {  // На одной
    // ...
}

// 4. Пробелы вокруг операторов
$result = $a + $b;  // Пробелы вокруг +

// 5. Максимум 80 символов на строку (рекомендация)
$veryLongVariableName = someFunctionCall($argument1, 
    $argument2, $argument3);

PSR-3: Logger Interface

Стандарт для логирования:

interface LoggerInterface {
    public function emergency($message, array $context = []);
    public function alert($message, array $context = []);
    public function critical($message, array $context = []);
    public function error($message, array $context = []);
    public function warning($message, array $context = []);
    public function notice($message, array $context = []);
    public function info($message, array $context = []);
    public function debug($message, array $context = []);
    public function log($level, $message, array $context = []);
}

// Все логгеры (Monolog, Sentry и т.д.) реализуют этот интерфейс
class FileLogger implements LoggerInterface {
    public function error($message, array $context = []) {
        file_put_contents('error.log', $message . PHP_EOL, FILE_APPEND);
    }
}

// Использование везде одинаково
function someFunction(LoggerInterface $logger) {
    $logger->error('Something went wrong', ['context' => 'data']);
}

PSR-4: Autoloader Standard

Стандарт для автозагрузки классов:

// PSR-4 соответствие: namespace → каталог
// namespace MyApp\Users\Repositories → src/Users/Repositories/

namespace MyApp\Users\Repositories;

class UserRepository {  // Файл: src/Users/Repositories/UserRepository.php
    // ...
}

// composer.json
{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src/",
            "Tests\\": "tests/"
        }
    }
}

// После composer install, автоматически:
require 'vendor/autoload.php';

$repo = new MyApp\Users\Repositories\UserRepository();
// Класс загружен автоматически!

PSR-6: Caching Interface

Стандарт для кэширования:

interface CacheItemPoolInterface {
    public function getItem($key);
    public function getItems(array $keys = []);
    public function hasItem($key);
    public function clear();
    public function deleteItem($key);
    public function save(CacheItemInterface $item);
}

// Redis, Memcached, файлы - все работают одинаково
class Service {
    public function __construct(CacheItemPoolInterface $cache) {}
    
    public function getUser($id) {
        $item = $this->cache->getItem("user:{$id}");
        if ($item->isHit()) {
            return $item->get();
        }
        
        $user = $this->fetchFromDB($id);
        $item->set($user)->expiresAfter(3600);
        $this->cache->save($item);
        return $user;
    }
}

PSR-7: HTTP Message Interface

Стандарт для HTTP сообщений (запросы/ответы):

interface RequestInterface {
    public function getMethod(): string;
    public function getUri(): UriInterface;
    public function getHeaders(): array;
    public function getBody(): StreamInterface;
}

interface ResponseInterface {
    public function getStatusCode(): int;
    public function withStatus($code, $reasonPhrase = '');
    public function getHeaders(): array;
    public function getBody(): StreamInterface;
}

// Используется в Guzzle, middleware и т.д.

PSR-11: Container Interface

Стандарт для Service Container:

interface ContainerInterface {
    public function get($id);  // Получить сервис
    public function has($id);  // Проверить наличие
}

// Любой DI контейнер (Laravel, Symfony, Pimple) реализует это
$container = new Container();
$container->set('database', function() {
    return new PDO('mysql:host=localhost');
});

function someFunction(ContainerInterface $container) {
    $db = $container->get('database');
    // ...
}

PSR-12: Extended Coding Style

Расширение PSR-2 с более современными стандартами:

// PSR-12 добавляет:

// 1. Типизированные параметры (PHP 7+)
function process(string $name, int $age): string {
    // ...
}

// 2. Nullable types
function findUser(?int $id): ?User {
    // ...
}

// 3. Union types (PHP 8+)
function getValue(int|string $value): int|string {
    // ...
}

// 4. Match expressions
$result = match($status) {
    'active' => 'Activated',
    'inactive' => 'Deactivated',
};

// 5. Null coalescing
$value = $input ?? 'default';

PSR-14: Event Dispatcher

Стандарт для event dispatcher'a:

interface EventDispatcherInterface {
    public function dispatch(object $event): object;
}

interface ListenerProviderInterface {
    public function getListenersForEvent(object $event): iterable;
}

// Используется для событий в приложении

Как использовать PSR в проекте?

1. Использование инструментов

# php-cs-fixer - автоматически приводит код к PSR
composer require --dev friendsofphp/php-cs-fixer
php-cs-fixer fix ./src --rules=@PSR12

# PHPStan - проверяет типы и правила
composer require --dev phpstan/phpstan
phpstan analyse src

# PHP_CodeSniffer - проверяет стиль
composer require --dev squizlabs/php_codesniffer
phpcs --standard=PSR12 src/

2. IDE конфигурация

# Настраиваем IDE на PSR-12 автоматически
# PHPStorm: Settings → PHP → Code Style → Set from... → PSR-1/2/12
# VS Code: .editorconfig файл

[*.php]
indent_style = space
indent_size = 4
charset = utf-8

3. Предкомиты (pre-commit hooks)

#!/bin/bash
# .git/hooks/pre-commit

php-cs-fixer fix --allow-risky=yes
phpstan analyse src --level=9
phpunit

Практический пример PSR-4

Проект структура:
my-app/
├── composer.json
├── src/
│   ├── Users/
│   │   ├── Repositories/
│   │   │   └── UserRepository.php
│   │   ├── Services/
│   │   │   └── UserService.php
│   │   └── Models/
│   │       └── User.php
│   └── Products/
│       └── Services/
│           └── ProductService.php
└── tests/
    └── Unit/
        └── UserRepositoryTest.php
// composer.json
{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    }
}

// src/Users/Repositories/UserRepository.php
namespace MyApp\Users\Repositories;

class UserRepository {}

// Использование - всё автоматически
require 'vendor/autoload.php';

$repo = new MyApp\Users\Repositories\UserRepository();

Зачем нужны PSR?

✅ Совместимость между фреймворками
✅ Единообразный код
✅ Легче переходить между проектами
✅ Инструменты работают стандартно
✅ Code review проще
✅ Новичков проще онбордить

Самые важные PSR для daily work

PSR-1  - Basic naming (всегда)
PSR-4  - Autoloading (всегда)
PSR-12 - Code style (всегда)
PSR-3  - Logging (если логируешь)
PSR-7  - HTTP messages (если работаешь с API)
PSR-11 - DI container (если используешь контейнер)

PSR - это соглашения, которые делают PHP экосистему единообразной и удобной для всех разработчиков.

Что такое PSR? | PrepBro