PHP-FIG (PHP Framework Interop Group) - организованная группа разработчиков, цель которой находить способы совместной работы нескольких фрейморков.

PSR (PHP Standarts Recomendations) - стандартные рекомендации, результат работы PHP-FIG. Одни члены группы предлагают правила для каждого PSR, другие голосуют в поддержку этих правил или за их отмену. Обсуждение проходит в Google Groups, а наборы PSR доступны на официальном сайте PHP-FIG.

Давайте рассмотрим некоторые PSR:

- PSR-0 - Autoloading standart

Первый шаг на пути объединения фреймворков - наличие общей структуры директорий, поэтому и был принят общий стандарт автозагрузки.

Правила:

  • Пространство имен (namespace) и класс должны иметь структуру \\(\)*;
  • Каждое пространство имен должно содержать пространство верхнего уровня ("Vendor Name");
  • Каждое пространство имен может иметь сколько угодно уровней;
  • Каждый разделитель пространства имен конвертируется в DIRECTORY_SEPARATOR при загрузке;
  • Каждый символ "_" в CLASS NAME конвертируется в DIRECTORY_SEPARATOR;
  • К полностью определённому пространству имен и классу добавляется ".php" при загрузке;

- PSR-1 - Basic coding standart

Эти PSR регулируют основные стандарты, главная идея которых - если все разработчики используют одни стандарты, то перенос кода можно производить без всяких проблем.

Правила:

  • В файлах должны использоваться только теги <?php и <?;
  • В файлах должна использоваться только кодировка UTF-8 without BOM;
  • Имена пространств и классы должны следовать PSR-0;
  • Имена классов должны быть объявлены в нотации StudlyCaps;
  • Константы класса должны быть объявлены в верхнем регистре, разделенные подчеркиваниями;
  • Методы должны быть объявлены в нотации camelCase;

- PSR-2 - Coding style guide

Это расширенные инструкции для PSR-1, описывающие правила форматирования кода.

Правила:

  • Код должен соответствовать PSR-1;
  • Вместо табуляции должны использоваться 4 пробела;
  • Не должно быть строгого ограничения на длину строки, рекомендуемая длина - до 80 символов;
  • Должна быть одна пустая строка после объявления пространства имен;
  • Скобки для классов должны открываться на следующей строке после объявления и закрываться после тела класса (то же самое для методов);
  • Видимость методов и свойств должна быть обязательно определена (public, protected, private);
  • Открывающие скобки для управляющих структур должны находиться на той же строке, закрывающие скобки должны быть на следующей строке после тела структуры;
  • Пробелы не ставятся после открывающихся круглых скобок методов управляющих структур и перед закрывающимися скобками;

- PSR-3 - Logger interface

В PSR-3 регулируется логгинг, в частности основные девять методов.

Методы:

  • LoggerInterface предоставляет 8 методов для логирования восьми RFC 5424 уровней (debug, notice, warning, error, critical, alert, emergency);
  • Девятый метод log() принимает на вход уровень предупреждения первым параметром. Вызов метода с параметром уровня предупреждения должен возвращать такой же результат, как и вызов метода определенного уровня лога (log(ALERT) == alert()). Вызов метода с неопределённым уровнем предупреждения должен генерировать Psr\Log\InvalidArgumentException;

- PSR-4 - Improved autoloading

Так же как и PSR-0, PSR-4 предоставляет улучшенные методы автозагрузки.

Правила:

  • Термин "класс" относится к классам, интерфейсам, трейтам и другим похожим структурам;
  • Полностью определённое имя класса имеет следующую форму: \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>;

При загрузке файла, соответствующему полностью определённому имени класса:

  • Непрерывная серия одного или более ведущих пространств имен, не считая ведущего разделителя пространства имен, в полностью определенном имени класса соответствует по крайней мере одной "корневой директории";
  • Имена директорий и поддиректорий должны соответствовать регистру пространства имен;
  • Окончание полного имени класса соответствует имени файла с окончанием .php. Регистр имени файла обязан соответствовать регистру окончания полного имени класса;
  • Реализация автозагрузчика не должна бросать исключения, генерировать ошибки любого уровня и не обязана возвращать значение;