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