Введение в стандартные рекомендации PHP (PSR)
Опубликовано: 2019-12-24Однажды на конференции ведущие разработчики из ряда фреймворков сели в одной комнате и согласовали некоторые стандарты для всех своих проектов. Цель заключалась в том, чтобы упростить объединение фреймворков и библиотек PHP для пользователей. Именно тогда и родилась php-fig: PHP Framework Interop Group. Эта группа замечательных людей следит за рекомендациями по стандартам PHP (PSR).
Стандартные рекомендации PHP (PSR) - это спецификация PHP, опубликованная группой PHP Framework Interoperability Group (PHP-FIG). Он служит для стандартизации концепций программирования в PHP. Цель состоит в том, чтобы обеспечить возможность взаимодействия компонентов. PHP-FIG сформирован несколькими основателями PHP-фреймворков.
ПСР-0 и ПСР-4
Они описывают спецификацию автоматической загрузки классов из путей к файлам. PSR-0 и PSR-4 являются стандартами в отношении пространств имен, имен классов и путей к файлам. Этот PSR также описывает, где разместить файлы, которые будут автоматически загружаться в соответствии со спецификацией.
Автозагрузка
Автозагрузка - это функция, которая помогает разработчикам автоматически включать PHP-классы без написания повсюду загроможденных инструкций include / require.
В PHP определение класса загружается с помощью операторов require или include в файлы, которые они вызывают, то есть до его использования, как показано ниже.

Вышеупомянутый подход вызывает некоторые проблемы, как если бы у нас есть десятки внешних классов, которые должны использоваться в файле, и мы начинаем писать строки операторов require / include прямо в начале исходного файла.
Чтобы решить эту проблему, в PHP 5 появилась волшебная функция __autoload (), которая автоматически вызывается, когда ваш код ссылается на класс или интерфейс, который еще не был загружен.

Вот пример базовой реализации __autoload ():

Главный недостаток функции __autoload () заключается в том, что вы можете предоставить с ней только один автозагрузчик. В PHP 5.1.2 появилась еще одна функция автозагрузки (spl_autoload_register) для преодоления ограничения __autoload.
Введение spl_autoload_register () дало программистам возможность создать цепочку автозагрузки, серию функций, которые можно вызвать, чтобы попытаться загрузить класс или интерфейс.
Например:


Автозагрузка была такой прекрасной идеей, что ее начали использовать в каждом проекте. Неизбежно каждый создавал свою собственную версию автозагрузчика, поскольку отсутствовали единые стандарты. Ясно, что PHP отчаянно нуждался в стандарте для автозагрузчика, и именно так родился PSR-0. Последний принятый стандарт автозагрузчика - PSR-4.
PSR-0 (стандарт автозагрузки)
Обзор ПСР-0:
- Полностью определенное пространство имен и класс должны иметь следующую структуру
\ <Имя поставщика> \ (<Пространство имен> \) * <Имя класса> - Каждое пространство имен должно иметь пространство имен верхнего уровня («Имя поставщика»).
- Каждое пространство имен может иметь столько подпространств имен, сколько пожелает.
- Каждый разделитель пространства имен преобразуется в DIRECTORY_SEPARATOR при загрузке из файловой системы.
- Каждый символ _ в ИМЯ КЛАССА преобразуется в DIRECTORY_SEPARATOR. Символ _ не имеет особого значения в пространстве имен.
- Полное пространство имен и класс имеют суффикс .php при загрузке из файловой системы.
- Буквенные символы в именах поставщиков, пространствах имен и именах классов могут иметь любую комбинацию строчных и прописных букв.
Примеры:
\ Doctrine \ Common \ IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\ Symfony \ Core \ Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php
ПСР-4 (Стандарт автозагрузки)
Обзор ПСР-4:
- Термин «класс» относится к классам, интерфейсам, характеристикам и другим подобным структурам.
- Полное имя класса имеет следующую форму:
\ <NamespaceName> (\ <SubNamespaceNames>) * \ <ClassName> - Полное имя класса ДОЛЖНО иметь имя пространства имен верхнего уровня, также известное как «пространство имен поставщика».
- Полное имя класса МОЖЕТ иметь одно или несколько имен подпространств имен.
- Полное имя класса ДОЛЖНО иметь завершающее имя класса.
- Подчеркивания не имеют особого значения в любой части полного имени класса.
- Буквенные символы в полном имени класса МОГУТ быть любой комбинацией строчных и прописных букв.
- Все имена классов ДОЛЖНЫ быть указаны с учетом регистра.
Пример автозагрузки на основе PSR-4 с использованием Composer:
- Рассмотрим следующую структуру каталогов для достижения автозагрузки на основе PSR-4 с использованием composer.

- Создайте файл composer.json с помощью composer init. Если нет, вы можете создать его вручную прямо сейчас в корне вашего проекта.

- Настройте автозагрузку PSR4, отредактировав файл composer.json, как показано ниже:

- Здесь CodeCourse - это имя поставщика вашего приложения, вы можете использовать это имя при размещении файлов в пространстве имен внутри вашего каталога src, например:

Или


и т.д,
- А src - это каталог вашего приложения, который вы хотите загрузить автоматически.
- Затем откройте свой терминал и введите следующую команду, чтобы установить файлы автозагрузки в ваш проект. Это сгенерирует каталог vendor и файл autoload.php внутри него.

- Давайте сначала создадим пару классов внутри каталога CodeCourse.
Создайте AuthFilters.php внутри CodeCourse / Filters

Создайте UserRepository.php внутри CodeCourse / Repositories

- Наконец, создайте файл index.php, чтобы проверить его, и вам нужно будет один раз потребовать файл autoload.php один раз в вашем файле index.php.

ПСР-1 и ПСР-2
PSR-1 и PSR-2 полезны для стандартов кодирования PHP. PSR-1 в основном ориентирован на базовый стандарт кодирования для PHP, тогда как PSR-2 больше похож на расширенную версию PSR-1. PSR-1 перечисляет набор простых правил для соглашений об именах, а PSR-2 предоставляет более полное руководство по стилю кодирования.
PSR-1 (базовый стандарт кодирования)
Обзор ПСР-1:
- Для тегов PHP разрешены только <? Php или <? =.
- Имена классов должны быть определены в UpperCamelCase.
- Переменные класса должны быть определены в camelCase.
- Константы класса должны быть определены в UPPER_SNAKE_CASE.
- Имена методов должны быть определены в camelCase.
- Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. Д.), Либо вызывать побочные эффекты (например, генерировать вывод, изменять настройки .ini и т. Д.), Но НЕ ДОЛЖНЫ делать и то, и другое. Т.е.,

Приведенный выше пример вызывает побочный эффект, то есть загрузку файла с именем «file.php».
- Файлы должны быть в кодировке UTF-8 без BOM (метка порядка байтов).
- Пространства имен и имена классов должны соответствовать стандартам PSR-0 и PSR-4.
Вот пример, иллюстрирующий основные соглашения об именах для свойств, классов и методов.

PSR-2 (Руководство по стилю кодирования)
Обзор ПСР-2:
- Вы должны соблюдать стандарты кодирования PSR-1.
- Для отступов необходимо использовать 4 пробела. Использование вкладок запрещено.
- Длина строки не ограничена, но она не должна превышать 120 символов, лучше всего - менее 80.
- После объявления пространства имен должна быть одна пустая строка, а после объявления блока использования должна быть одна пустая строка.
- Открывающие фигурные скобки для классов и методов должны располагаться на следующей строке, а закрывающие фигурные скобки должны располагаться на строке после тела.
- Методы и свойства должны быть определены вначале с ключевым словом abstract / final, затем с ключевым словом public / protected и, наконец, static.
- В условных операторах нельзя ставить новую строку перед фигурными скобками.
- Вы не должны ставить пробелы перед (и) в условных операторах.
- Пример определения классов:
- Вы должны открыть фигурные скобки на новой строке, а ключевые слова extends и Implements должны использоваться в одной строке.

Если необходимо реализовать несколько интерфейсов, вы можете записать имена интерфейсов в новой строке, как показано ниже:

Пример, показывающий, как методы определены в PHP:
При определении методов аргументы должны быть записаны в одной строке. Кроме того, вы не должны ставить пробелы перед запятыми в аргументах, и вы должны ставить один пробел после них.

Если аргументов много, их можно записать с новой строкой один за другим:

При определении методов у вас должен быть один из общедоступных / защищенных / частных и абстрактных / окончательных. Режимы видимости идут после ключевого слова abstract / final, если оно используется. static - последний модификатор.

Условные утверждения
- Вы должны поставить один пробел перед (
- После (
- Перед этим нельзя ставить пробелы)
- Вы должны поставить один пробел после)
- используйте elseif, а не else if.
Пример, показывающий разницу между elseif и else if:
Интерпретация elseif:

Интерпретация else if:

Для операторов switch
- Фигурные скобки необходимо открывать в той же строке, где написан оператор switch.
- Тело корпуса должно иметь однократный отступ от регистра, а регистр - один раз от переключателя.
- Не используйте перерыв, если перерыв не нужен.
- Вы также можете использовать return вместо break.
Пример:
