Стандарты кодирования PHP (PSR)

Категория: / DEV Блог / PHP (LAMP)
Группа взаимодействия фреймворков (PHP-FIG) окончательно приняла рекомендации к стандартам оформления кода на PHP.

Документ называется PSR (Proposing a Standards Recommendation - Предлагаемые рекомендации стандартов) и разделен на 3 части.

Оригинальные тексты можно посмотреть на гитхабе.

Вкратце,

PSR-0: требования к названиям классов

и неймспейсов для универсального автозагрузчика.
Полное имя класса должно быть вида `\<Vendor Name>\(<Namespace>\)*<Class Name>`

`\Symfony\Core\Request` => `/path/to/project/lib/vendor/Symfony/Core/Request.php`
`\Zend\Acl` => `/path/to/project/lib/vendor/Zend/Acl.php`
`\namespace\package_name\Class_Name` => `/path/to/project/lib/vendor/namespace/package_name/Class/Name.php`


PSR-1: Основные стандарты кодирования

Секция описывает общие правила оформления кода:

- Использование только тэгов <?php и <?=
- Только UTF-8 без BOM для пхп кода
- Не стоит мешать разный функционал в одном файле
- NS и классы должны следовать psr-0
- классы объявляются в `StudlyCase`
- методы объявляются в lower `camelCase`
- константы объявляются в ТАКОМ_ВИДЕ

К свойствам класса не предъявляется требований, они могут объявляться в любом виде,
важно чтобы стиль был однотипным для всего проекта.

PSR-2: Стандарты оформления кода

Собственно представляет собой требования к оформлению кода:

- код должен пользовать 4 пробела вместо ТАБ для отделения кода

- длина строки не более 80 символов, ну 120 в крайнем случае

- пустая строка после объявления NS и USE блока

- открывающая скобка `{` объявления класса и методов должна находится на следующей строке, а закрывающая `}` на следующей строке после кода

- для всех свойств и методов обязательно указывать видимость;
ключевые слова `abstract` и `final` указываются до объявления видимости, а `static` после

- После управляющих ключевых слов (команд языка) должен ставиться пробел, не ставится после вызова методов и функций

- Открывающие скобки `{` для команд ставятся на одной строке с ключевым словом, а закрывающая `}` на следующей строке после кода

- Скобки команд `()` не должны начинаться и заканчиваться пробелами

Интерфейсы должны заканчиваться на `Interface`: например, Psr\Foo\BarInterface.
Абстрактные классы должны начинаться на `Abstract`: например, Psr\Foo\AbstractBar.
Трейты должны заканчиваться на `Trait`: например, Psr\Foo\BarTrait.

Пример оформления:

<?php
namespace Vendor\Package;
 
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }
 
    final public static function bar()
    {
        // method body
    }
}


В голосовании по принятию стандартов участвовали разработчики таких проектов, как

Agavi
CakePHP, CakePHP 2
Chisimba, C4
Composer, Packagist
Doctrine, Doctrine2, et al.
Drupal
eZ Publish
FLOW3
Joomla
Lithium
PEAR, PEAR2
phpBB
PPI, PPI2
Propel, Propel 2
SabreDAV
Solar Framework, Aura Project
Symfony, Symfony2
Zend Framework, Zend Framework 2
Zikula

Соответствование требованием конкретных проектов можно посмотреть на
гугл докс