Если вы занимались разработкой PHP последние несколько лет, то наверняка знаете о проблемах этого языка. Зачастую можно услышать, что это фрагментированный язык, инструмент для взломов, что он не имеет настоящей спецификации и т.д. Реальность же такова, что PHP сильно «вырос» в последнее время. Версия PHP 5.4 приблизила его к полной объектной модели и предоставила много новой функциональности.
И это все, конечно, хорошо, но что насчёт фрейморков? На PHP их существует огромное множество. Стоит только начать искать и вы поймете, что вам не хватит жизни изучить их все, потому что новые фрейморки появляются постоянно и в каждом изобретается что-то свое. Так как же превратить это в нечто, что не отталкивает разработчиков и позволяет легко переносить функционал из одного фреймворка в другой?
Что такое PHP-FIG
PHP-FIG (PHP Framework Interop Group) — организованная группа разработчиков, цель которой находить способы совместной работы нескольких фрейморков.
Только представьте: сейчас вы поддерживаете проект на Zend Framework, которому понадобился модуль корзины магазина. Вы уже писали такой модуль для предыдущего проекта, который был на Symphony. Не делать же его снова? К счастью и ZendF и Symphony являются частью PHP-FIG, так что можно импортировать модуль с одного фреймворка в другой. Разве не здорово?
Давайте узнаем, какие фреймворки входят в PHP-FIG
Участники PHP-FIG
Любой разработчик может внести свой фреймворк в список участников PHP-FIG. Тем не менее за это необходимо будет заплатить некую сумму, так что если у вас нет поддержки сообщества вы врядли согласитесь на это. Это сделано для того, чтобы предотвратить регистрацию миллионов микрофреймворков без какой-либо репутации.
Текущие участники:

Что такое PSR?
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, private).
- Открывающие скобки для управляющих структур должны находиться на той же строке, закрывающие скобки должны быть на следующей строке после тела структуры.
- Пробелы не ставятся после открывающихся круглых скобок методов управляющих структур и перед закрывающимися скобками.
PCR-3 — Logger Interface
В PCR-3 регулируется логгинг, в частности основные девять методов.
Методы:
- LoggerInterface предоставляет 8 методов для логирования восьми RFC 5424 уровней (debug, notice, warning, error, critical, alert, emergency).
- Девятый метод log() принимает на вход уровень предупреждения первым параметром. Вызов метода с параметром уровня предупреждения должен возвращать такой же результат, как и вызов метода определенного уровня лога ( log(ALERT) == alert() ). Вызов метода с неопределённым уровнем предупреждения должен генерировать Psr\Log\InvalidArgumentException.
PCR-4 — Improved Autoloading
Так же как и PSR-0, PSR-4 предоставляет улучшенные методы автозагрузки
Правила:
- Термин «класс» относится к классам, интерфейсам, трейтам и другим похожим структурам
- Полностью определённое имя класса имеет следующую форму: \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
- При загрузке файла, соответствующему полностью определённому имени класса:
- Непрерывная серия одного или более ведущих пространств имен, не считая ведущего разделителя пространства имен, в полностью определенном имени класса соответствует по крайней мере одной «корневой директории».
- Имена директорий и поддиректорий должны соответствовать регистру пространства имен.
- Окончание полного имени класса соответствует имени файла с окончанием .php. Регистр имени файла обязан соответствовать регистру окончания полного имени класса.
- Реализация автозагрузчика не должна бросать исключения, генерировать ошибки любого уровня и не обязана возвращать значение.
Заключение
PHP-FIG изменяет способы написания фреймворков, но не то как они работают. Клиенты часто обязывают работать с существующим кодом внутри фреймворка или определяют с каким фреймворком вы должны работать над проектом. PSR рекомендации делают жизнь разработчиков на много легче в этом отношении и это здорово!
