Статьи

Рабочая группа по стандартам PHP


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

Сообщество PHP прилагает большие усилия для обеспечения соблюдения стандартов кодирования. Цель этого состоит в том, чтобы упростить поддержку взаимодействия структур. Это также помогает разработчикам понимать и читать код, если он придерживается определенного набора правил. Java уже долгое время имела форму JCP, создавая JSR, чтобы предлагать изменения языка, а также создание API. Это аналогичное усилие.

PSR-0 имел большой успех, и теперь у них есть 2 новых предложения, которые называются
PSR-1 и
PSR-2 .

PSR-0

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

  • Полное пространство имен и класс должны иметь следующую структуру

 


\ \ () * \

 

Пространства имен полезны в PHP, чтобы избежать коллизий при загрузке имен классов. Когда я пишу код API или библиотеки, я уже склонен следовать этому формату. Например, класс в библиотеке аутентификации может иметь пространство имен, подобное следующему:
net \ rt \ toolkit \ auth \ LoginService .

Где: 

net \ rt — это имя поставщика,

auth — это пространство имен. 

LoginService — это имя класса.

  • Каждое пространство имен должно иметь пространство имен верхнего уровня («Имя поставщика»). 
  • Каждое пространство имен может иметь столько подпространств, сколько пожелает. 
  • Каждый разделитель пространства имен преобразуется в DIRECTORY_SEPARATOR при загрузке из файловой системы. 
  • Каждый символ «_» в ИМЯ КЛАССА преобразуется в DIRECTORY_SEPARATOR. Символ «_» не имеет особого значения в пространстве имен. 
  • При загрузке из файловой системы к полному пространству имен и классу добавляется суффикс «.php». Буквенные символы в именах поставщиков, пространствах имен и именах классов могут состоять из любой комбинации строчных и прописных букв. 
 

Для проверки вашего соответствия этому стандарту вы можете использовать следующую функцию:

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
 
    require $fileName;
}

 PSR-1


Большинство из них говорят сами за себя, я попытался добавить больше деталей к тем, которые не являются:

  • Файлы ДОЛЖНЫ использовать только теги.
  • Файлы ДОЛЖНЫ использовать только UTF-8 без спецификации для кода PHP.

BOM (метка порядка байтов) — это символ, который указывает порядок байтов потока.
Стандарт Unicode разрешает использование спецификации,
но не
требует и не рекомендует ее использование .
Порядок байтов не имеет значения в UTF-8
, он служит только для идентификации текстового потока или файла как UTF-8.
    
  • Файлы должны либо DECLARE символы (классы, функции, константы и т.д.) или вызывают побочные эффекты (например , генерировать выходной сигнал, изменения .ini настройки и т.д.) , но не должны делать оба.

Это также служит для хранения классов с функциями и константами в их отдельных файлах.
Если файл изменяет настройки .ini, попросите этот файл просто сделать это и укажите ясное имя, что это файл конфигурации.
  • Пространства имен и классы ДОЛЖНЫ следовать PSR-0 (см. Выше).
  • Имена классов ДОЛЖНЫ быть объявлены в StudlyCaps.
  • Константы класса ДОЛЖНЫ быть объявлены в верхнем регистре с разделителями подчеркивания.
  • Имена методов ДОЛЖНЫ быть объявлены в camelCase.

PSR-2

  • Код ДОЛЖЕН соответствовать PSR-1 (см. Выше)
  • Код ДОЛЖЕН использовать 4 пробела для отступа, а не табуляции.
  • НЕ ДОЛЖНО быть жесткого ограничения на длину линии; мягкий предел ДОЛЖЕН быть 120 символов; строки ДОЛЖНЫ быть 80 символами или меньше.
  • ДОЛЖНА быть одна пустая строка после объявления пространства имен, и ДОЛЖНА быть одна пустая строка после объявления блока использования.
  • Открывающие скобки для классов ДОЛЖНЫ идти на следующую строку, а закрывающие скобки ДОЛЖНЫ идти на следующую строку после тела (не так критично).
  • Открывающие скобки для методов ДОЛЖНЫ идти на следующую строку, а закрывающие скобки ДОЛЖНЫ идти на следующую строку после тела (не так критично).
  • Видимость ДОЛЖНА быть объявлена ​​для всех свойств и методов; абстрактный и окончательный ДОЛЖНЫ быть объявлены до видимости; статический ДОЛЖЕН быть объявлен после видимости.
  • Ключевые слова структуры управления ДОЛЖНЫ иметь один пробел после них; вызовы методов и функций НЕ ДОЛЖНЫ.
  • Открывающие скобки для управляющих структур ДОЛЖНЫ идти на одной строке, а закрывающие скобки ДОЛЖНЫ идти на следующей строке после тела.
  • Открывающие скобки для управляющих структур НЕ ДОЛЖНЫ иметь после них пробел, а закрывающие скобки для управляющих структур НЕ ДОЛЖНЫ иметь пробел.

Ниже приведен пример того, как должен выглядеть класс после применения некоторых принципов, описанных здесь, в их примере в скобках были несоответствия, поэтому я исправил их здесь:

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
    }