Я знаю, что эта тема была написана много. Но я думаю, что это так важно, что я хотел продолжать в том же духе и продолжать его продвигать.
Сообщество 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 }