Устаревший - по состоянию на 10 августа 2019 года PSR-2 помечен как устаревший. В качестве альтернативы теперь рекомендуется PSR-12 .
Это руководство расширяет и дополняет PSR-1 , базовый стандарт кодирования.
Цель этого руководства - уменьшить когнитивное трение при сканировании кода от разных авторов. Это достигается путем перечисления общего набора правил и ожиданий относительно форматирования кода PHP.
Приведенные здесь правила стиля основаны на общих чертах между различными проектами-участниками. Когда разные авторы сотрудничают в нескольких проектах, полезно иметь один набор руководящих принципов, который будет использоваться для всех этих проектов. Таким образом, польза от этого руководства не в самих правилах, а в том, что они распространяются.
Ключевые слова «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ТРЕБУЕТСЯ», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «РЕКОМЕНДУЕТСЯ», «МОЖЕТ» и «ДОПОЛНИТЕЛЬНО» в этом документе являются следует интерпретировать, как описано в RFC 2119 .
Код ДОЛЖЕН соответствовать «руководству по стилю кодирования» PSR [ PSR-1 ].
Код ДОЛЖЕН использовать 4 пробела для отступов, а не табуляции.
НЕ ДОЛЖНО быть жесткого ограничения на длину строки; мягкий предел ДОЛЖЕН быть 120 символов; строки ДОЛЖНЫ состоять из 80 символов или меньше.
После namespace объявления ДОЛЖНА быть одна пустая строка, и после блока use объявлений ДОЛЖНА быть одна пустая строка .
Открывающие фигурные скобки для классов ДОЛЖНЫ располагаться на следующей строке, а закрывающие фигурные скобки ДОЛЖНЫ располагаться на следующей строке после тела.
Открывающие фигурные скобки для методов ДОЛЖНЫ располагаться на следующей строке, а закрывающие фигурные скобки ДОЛЖНЫ располагаться на следующей строке после тела.
Видимость ДОЛЖНА быть объявлена для всех свойств и методов; abstract и final ДОЛЖЕН быть объявлен до видимости; static ДОЛЖЕН быть объявлен после видимости.
Ключевые слова структуры управления ДОЛЖНЫ иметь один пробел после них; вызовы методов и функций НЕ ДОЛЖНЫ.
Открывающие фигурные скобки для управляющих структур ДОЛЖНЫ располагаться на одной строке, а закрывающие фигурные скобки ДОЛЖНЫ располагаться на следующей строке после тела.
Открывающие круглые скобки для управляющих структур НЕ ДОЛЖНЫ иметь пробел после них, а закрывающие круглые скобки для управляющих структур НЕ ДОЛЖНЫ иметь пробел перед.
Этот пример включает в себя некоторые из приведенных ниже правил в качестве краткого обзора:
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($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
}
}
Код ДОЛЖЕН соответствовать всем правилам, изложенным в PSR-1 .
Все файлы PHP ДОЛЖНЫ использовать окончание строки Unix LF (перевод строки).
Все файлы PHP ДОЛЖНЫ заканчиваться одной пустой строкой.
Закрывающий ?>тег ДОЛЖЕН быть опущен в файлах, содержащих только PHP.
НЕ ДОЛЖНО быть жесткого ограничения на длину строки.
Мягкое ограничение на длину строки ДОЛЖНО составлять 120 символов; автоматические средства проверки стиля ДОЛЖНЫ предупреждать, но НЕ ДОЛЖНЫ ошибаться на мягком пределе.
Строки НЕ ДОЛЖНЫ быть длиннее 80 символов; строки длиннее этого ДОЛЖНЫ быть разделены на несколько последующих строк не более 80 символов в каждой.
НЕ ДОЛЖНЫ быть завершающие пробелы в конце непустых строк.
Пустые строки МОГУТ быть добавлены для улучшения читаемости и для обозначения связанных блоков кода.
НЕ ДОЛЖНО быть более одного оператора в строке.
Код ДОЛЖЕН использовать отступ в 4 пробела и НЕ ДОЛЖЕН использовать табуляцию для отступа.
Nb: Использование только пробелов, а не смешивание пробелов с табуляциями, помогает избежать проблем с различиями, патчами, историей и аннотациями. Использование пробелов также упрощает вставку мелких отступов для межстрочного выравнивания.
Ключевые слова PHP ДОЛЖНЫ быть в нижнем регистре.
Константы PHP true, falseи null должны быть в нижнем регистре.
Если он присутствует, после namespace объявления ДОЛЖНА быть одна пустая строка .
Если они присутствуют, все use объявления ДОЛЖНЫ идти после namespace объявления.
В объявлении ДОЛЖНО быть одно use ключевое слово.
После use блока ДОЛЖНА быть одна пустая строка .
Например:
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... additional PHP code ...
Термин «класс» относится ко всем классам, интерфейсам и характеристикам.
extends И implements ключевые слова должны быть объявлены на одной и той же строке, что и имя класса.
Открывающая скобка для класса ДОЛЖНА находиться в отдельной строке; закрывающая фигурная скобка для класса ДОЛЖНА стоять на следующей строке после тела.
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}
Списки implements МОГУТ быть разделены на несколько строк, где каждая последующая строка имеет один отступ. При этом первый элемент в списке ДОЛЖЕН находиться на следующей строке, и на каждой строке ДОЛЖЕН быть только один интерфейс.
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// constants, properties, methods
}
Видимость ДОЛЖНА быть объявлена для всех свойств.
var Ключевое слово недопустимо использовать для объявления свойства.
НЕ ДОЛЖНО быть объявлено более одного свойства для одного оператора.
Имена свойств НЕ ДОЛЖНЫ начинаться с одного символа подчеркивания, чтобы указать защищенную или частную видимость.
Объявление свойства выглядит следующим образом.
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
Видимость ДОЛЖНА быть объявлена для всех методов.
Имена методов НЕ ДОЛЖНЫ начинаться с одного символа подчеркивания, чтобы указать защищенную или частную видимость.
Имена методов НЕ ДОЛЖНЫ объявляться с пробелом после имени метода. Открывающая фигурная скобка ДОЛЖНА располагаться на отдельной строке, а закрывающая фигурная скобка ДОЛЖНА располагаться на следующей строке после тела. НЕ ДОЛЖНО быть пробелов после открывающей круглой скобки, и НЕ ДОЛЖНО быть пробела перед закрывающей круглой скобкой.
Объявление метода выглядит следующим образом. Обратите внимание на размещение скобок, запятых, пробелов и фигурных скобок:
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
В списке аргументов НЕ ДОЛЖНО быть пробела перед каждой запятой, и ДОЛЖЕН быть один пробел после каждой запятой.
Аргументы метода со значениями по умолчанию ДОЛЖНЫ находиться в конце списка аргументов.
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
Списки аргументов МОГУТ быть разделены на несколько строк, где каждая последующая строка имеет один отступ. При этом первый элемент в списке ДОЛЖЕН находиться на следующей строке, и в каждой строке ДОЛЖЕН быть только один аргумент.
Когда список аргументов разделен на несколько строк, закрывающая скобка и открывающая скобка ДОЛЖНЫ быть помещены вместе на отдельной строке с одним пробелом между ними.
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
) {
// method body
}
}
abstract, finalИstatic
Объявления abstract и, если они присутствуют, final ДОЛЖНЫ предшествовать объявлению видимости.
Если объявление присутствует, оно static ДОЛЖНО идти после объявления видимости.
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// method body
}
}
При вызове метода или функции НЕ ДОЛЖНО быть пробела между именем метода или функции и открывающей круглой скобкой, НЕ ДОЛЖНО быть пробела после открывающей круглой скобки и НЕ ДОЛЖНО быть пробела перед закрывающей круглой скобкой. В списке аргументов НЕ ДОЛЖНО быть пробела перед каждой запятой, и ДОЛЖЕН быть один пробел после каждой запятой.
<?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3);
Списки аргументов МОГУТ быть разделены на несколько строк, где каждая последующая строка имеет один отступ. При этом первый элемент в списке ДОЛЖЕН находиться на следующей строке, и в каждой строке ДОЛЖЕН быть только один аргумент.
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
Общие правила стиля для управляющих структур следующие:
Тело каждой конструкции ДОЛЖНО быть заключено в фигурные скобки. Это стандартизирует внешний вид структур и снижает вероятность появления ошибок при добавлении новых строк в тело.
if, elseif,else
if Структура выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок; и что else и elseif находятся на той же линии, что и закрывающая фигурная скобка из более раннего тела.
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
Ключевое слово elseif ДОЛЖНО использоваться вместо того, else if чтобы все ключевые слова управления выглядели как отдельные слова.
switch,case
switch Структура выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок. case Заявление должно быть отступом один раз из switch, и break ключевое слово (или другой терминатор ключевое слово) , должны быть смещены на том же уровне, что и case тело. ДОЛЖЕН быть комментарий, например, // no break когда провал в непустом case теле намеренно .
<?php
switch ($expr) {
case 0:
echo 'First case, with a break';
break;
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
while,do while
whileЗаявление выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок.
<?php
while ($expr) {
// structure body
}
Точно так же do while утверждение выглядит следующим образом. Обратите внимание на размещение скобок, пробелов и фигурных скобок.
<?php
do {
// structure body;
} while ($expr);
for
for Заявление выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок.
<?php
for ($i = 0; $i < 10; $i++) {
// for body
}
foreach
foreach Заявление выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок.
<?php
foreach ($iterable as $key => $value) {
// foreach body
}
try,catch
try catch Блок выглядит следующим образом . Обратите внимание на размещение скобок, пробелов и фигурных скобок.
<?php
try {
// try body
} catch (FirstExceptionType $e) {
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
Замыкания ДОЛЖНЫ объявляться с пробелом после function ключевого слова и пробелом до и после use ключевого слова.
Открывающая фигурная скобка ДОЛЖНА находиться на той же строке, а закрывающая фигурная скобка ДОЛЖНА находиться на следующей строке после тела.
НЕ ДОЛЖНО быть пробела после открывающей скобки списка аргументов или списка переменных, и НЕ ДОЛЖНО быть пробела перед закрывающей скобкой списка аргументов или списка переменных.
В списке аргументов и списке переменных НЕ ДОЛЖНО быть пробела перед каждой запятой, и ДОЛЖЕН быть один пробел после каждой запятой.
Аргументы закрытия со значениями по умолчанию ДОЛЖНЫ находиться в конце списка аргументов.
Объявление закрытия выглядит следующим образом. Обратите внимание на размещение скобок, запятых, пробелов и фигурных скобок:
<?php
$closureWithArgs = function ($arg1, $arg2) {
// body
};
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
// body
};
Списки аргументов и списки переменных МОГУТ быть разделены на несколько строк, где каждая последующая строка имеет один отступ. При этом первый элемент в списке ДОЛЖЕН находиться на следующей строке, и в каждой строке ДОЛЖЕН быть только один аргумент или переменная.
Когда конечный список (будь то аргументы или переменные) разделен на несколько строк, закрывающая скобка и открывающая скобка ДОЛЖНЫ быть помещены вместе на отдельной строке с одним пробелом между ними.
Ниже приведены примеры замыканий со списками аргументов и без них, а также списками переменных, разбитыми на несколько строк.
<?php
$longArgs_noVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// body
};
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
Обратите внимание, что правила форматирования также применяются, когда замыкание используется непосредственно в вызове функции или метода в качестве аргумента.
<?php
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// body
},
$arg3
);
В этом руководстве намеренно опущены многие элементы стиля и практики. К ним относятся, но не ограничиваются:
Объявление глобальных переменных и глобальных констант
Объявление функций
Операторы и назначение
Межстрочное выравнивание
Блоки комментариев и документации
Префиксы и суффиксы имени класса
Лучшие практики
В будущих рекомендациях МОГУТ быть пересмотрено и расширено это руководство с учетом тех или иных элементов стиля и практики.