Шпаргалка по PSR
NikolasSumrakДисклеймер: По сути для повседневной разработки на базе какого-либо фреймворка нужно знать только несколько стандартов кодирования (PSR-2/PSR-12), да и те можно просто настроить в своей IDE и использовать автоформатирование кода. Скорее всего многие стандарты уже используются в вашем фреймворке.
Для удобной работы с HTTP библиотеками (например Guzzle), библиотеками кэша, сторонними логгерами - советую присмотреться к некоторым стандартам.
На мой взгляд - самые основные на данный момент - это PSR-12 и PSR-14.
Ну а если вы вдруг являетесь автором какой-либо библиотеки - то сделайте дабл-чек, возможно стоит отрефакторить чего-нибудь.
PSR-14 имеет жирный минус в интерфейсе диспетчера.
Вот как он выглядит
namespace Psr\EventDispatcher;
interface EventDispatcherInterface
{
public function dispatch(object $event);
}
Обратите внимание на тип аргумента $event. Из-за того, что там указан object, следующий код выдаст ошибку:
class Dispatcher implements EventDispatcherInterface
{
public function dispatch(EventInterface $event) { ... }
// Fatal error: Declaration of Dispatcher::dispatch(EventInterface
// $event) must be compatible with
// EventDispatcherInterface::dispatch(object $event)
}
PSR-0 - Стандарт автозагрузки
Все что нужно знать о нем сейчас - он устарел, необходимо использовать PSR-4.
PSR-1 Основной стандарт кодирования
Описывает правило создания php файлов, правила именования переменных, классов, констант, методов. Также ссылается на стандарты автозагрузки PSR-0 и PSR-4.
PSR-2 Руководство по стилю кода. Доп к PSR-1
Описывает положение скобок, пробелы вместо табов, максимальную длину строки, переносы строк и несколько других вещей. с 10 октября 2019 года устарел, вместо него предлагается использовать более новый, PSR-12
PSR-3 Logger Interface
Описывает, как должен выглядеть логгер приложения, а также предоставляет несколько интерфейсов. Посмотреть интерфейсы и классы можно по ссылкам ниже
PSR-4 Автозагрузчик
Данный PSR описывает спецификацию для автозагрузки классов на основе путей файлов. Она полностью взаимозаменяема и может использоваться в дополнение к любой другой спецификации автозагрузчика, включая PSR-0. Данный PSR также описывает, где размещать файлы, которые будут загружаться в соответствии со спецификацией.
PSR-5 - Отсутствует (в черновике)
PSR-6 Caching Interface
Описывает интерфейсы для кэширующих библиотек. В конечном счёте - разработчику не нужно будет держать в голове кучу различных реализаций кэша, т.к. всё будет стандартизировано этими интерфейсами.
Ссылки: ENG
Посмотреть реализацию на примере PHPixie ТУТ
PSR-7 HTTP message interfaces
Описывает интерфейсы HTTP сообщений, Request/Response.
Ссылки: Хабр на русском ENG
PSR-8 - Отсутствует (отказались)
PSR-9 - Отсутствует (отказались)
PSR-10 - Отсутствует (отказались)
PSR-11 - Container interface
Этот документ описывает общий интерфейс для контейнеров внедрения зависимостей. (Dependency Injection Containers)
Ссылки: ENG
PSR-12 - Обновленные стандарты кодирования.
Эта спецификация расширяет и заменяет PSR-2, руководство по стилю кодирования, и требует соблюдения PSR-1, основного стандарта кодирования.
Интересная ремарка:
В этом документе любые инструкции МОГУТ быть проигнорированы, если они не существуют в версиях PHP, поддерживаемых вашим проектом.
Быстрый пример, который отражает некоторые правила из стандарта
<?php
declare(strict_types=1);
namespace Vendor\Package;
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;
use function Vendor\Package\{functionA, functionB, functionC};
use const Vendor\Package\{ConstantA, ConstantB, ConstantC};
class Foo extends Bar implements FooInterface
{
public function sampleFunction(int $a, int $b = null): array
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
Полную версию разберем в следующих статьях, а самые нетерпеливые могут ознакомиться на английском, ТУТ
PSR-13 Интерфейсы определения ссылок
Гипермедиа-ссылки становятся все более важной частью Интернета как в контексте HTML, так и в различных форматах API. Тем не менее, не существует единого общего формата гипермедиа и не существует общего способа представления ссылок между форматами.
Эта спецификация направлена на то, чтобы предоставить разработчикам PHP простой, общий способ представления гипермедиа-ссылки независимо от используемого формата сериализации. Это, в свою очередь, позволяет системе сериализовать ответ с гиперссылками в один или несколько проводных форматов независимо от процесса принятия решения о том, какими должны быть эти ссылки.
Ссылки:
PSR-14 Event Dispatcher
Диспетчеризация событий - это распространенный и хорошо протестированный механизм, позволяющий разработчикам легко и последовательно вводить логику в приложение.
Целью этого PSR является создание общего механизма расширения и совместной работы на основе событий, чтобы библиотеки и компоненты могли более свободно использоваться в различных приложениях и средах.
- Event - Событие - это сообщение, созданное Эмиттером. Это может быть любой произвольный объект PHP.
- Listener - Слушатель - это любой вызываемый PHP, который ожидает передачи события. Ноль или более слушателей могут быть вызваны на одно и то же событие. Слушатель МОЖЕТ ставить в очередь какое-то другое асинхронное поведение, если он того пожелает.
- Emitter - Эмиттер - это любой произвольный код, который желает отправить Событие. Это также известно как «код вызова». Он не представлен какой-либо конкретной структурой данных, но относится к варианту использования.
- Dispatcher - Диспетчер - это сервисный объект, которому Emitter присваивает объект Event. Диспетчер несет ответственность за передачу события всем соответствующим слушателям, но ДОЛЖЕН отложить определение ответственных слушателей до поставщика слушателей.
- Listener Provider - Провайдер Слушателя - отвечает за определение того, какие слушатели имеют отношение к данному событию, но НЕ ДОЛЖЕН вызывать сами слушатели. Провайдер слушателя может указать ноль или более соответствующих слушателей.
Ссылки:
PSR-15 Обработчики HTTP запроса сервера
Описаны общие интерфейсы для обработчиков запросов (Request Handlers) а также для Middleware-компонентов. Используются HTTP сообщения из PSR-7
Приведу оба интерфейса тут
namespace Psr\Http\Server;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
/**
* Обрабатывает запрос к серверу и выдает ответ.
*
* Обработчик HTTP-запроса обрабатывает HTTP-запрос, чтобы создать
* HTTP ответ.
*/
interface RequestHandlerInterface
{
/**
* Обрабатывает запрос и выдает ответ.
*
* Может вызывать другой код для генерации ответа.
*/
public function handle(ServerRequestInterface $request): ResponseInterface;
}
namespace Psr\Http\Server;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
/**
* Участник обработки запроса и ответа сервера.
*
* HTTP Middleware участвует в обработке сообщения HTTP:
* действуя по запросу, генерируя ответ или пересылая
* запрос к последующему Middleware и, и, возможно, действуя на его
* ответ.
*/
interface MiddlewareInterface
{
/**
* Обработать входящий запрос сервера.
*
* Обрабатывает входящий запрос сервера для получения ответа.
* Если не удается получить ответ сам, он может делегировать
* в предоставленный request handler.
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;
}
Ссылки: ENG
PSR-16 Общий интерфейс для Кеширующих библиотек
Описывает простой, но расширяемый интерфейс для Cache Item и драйвера кэша.
Приводить не буду, все по ссылке ниже.
Ссылки: ENG
PSR-17 Request/Response Factories (HTTP Factories)
Описывает интерфейсы фабрик для создания Request и Response.
Аналогично, все интерфейсы по ссылке ниже
Ссылки: ENG
PSR-18 HTTP Клиент
Описывает интерфейсы отправки и получения HTTP запросов/ответов.
Ссылка: ENG