Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# 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 экосистему единообразной и удобной для всех разработчиков.