PHP Coding Standards fixer

5 min read

Стандарты оформления — это набор правил, в которых оговаривается внешний вид кода: где ставятся пробелы, где нужны пустые строки, какие кавычки использовать и так далее.

Они помогают приводить код к единому виду. Это важно для командной работы, изучения или доработки open-source программ — разбираться в чужом коде проще и быстрее. Потратив немного времени на внедрение стандартов оформления в вашей работе вы получите гарантированный выигрыш в продуктивности: читать чужой код будет так же легко, как и свой. 

Существует несколько стандартов оформления кода. Для PHP наиболее распространены — Zend Coding Standard, PEAR и PSR. В статье рассмотрим способ автоматического оформления кода по стандарту PSR. Для этого существует удобная библиотека php-cs-fixer

Установка

Установить php-cs-fixer можно глобально или локально. При локальной установке библиотека будет сохранена в папке vendor вашего проекта.

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

Локальная установка:

composer require friendsofphp/php-cs-fixer

Глобальная установка:

composer global require friendsofphp/php-cs-fixer

Глобальная установка бывает удобна для использования в нескольких проектах, но с разными стилистическими правилами. Чтобы в терминале использовать команду php-cs-fixer, необходимо указать путь в переменной окружения PATH. Пользователи Unix систем могут это сделать прямо в терминале с помощью команды. Пакеты, установленные глобально, находятся в папке $HOME/.composer/vendor/

export PATH="$PATH:$HOME/путь-к-папке-библиотеки"

Способ задания переменной окружения PATH для пользователей Windows описан здесь.

Запуск

Исправить оформление кода можно либо в отдельном файле, либо во всех файлах указанной папки. Делается это с помощью команды fix.  По умолчанию используются стандарты PSR-1 и PSR-2.

При глобальной установке:

php-cs-fixer fix путь-к-файлу.php php-cs-fixer fix путь-к-папке/

В случае локальной установки вам необходимо обратиться к скомпилированному файлу:

/path/to/project/vendor/bin/php-cs-fixer fix путь-к-файлу.php

Настройка

Для описания правил оформления кода существует параметр --rules, который можно передать в консоли при выполнении команды.

php-cs-fixer fix /path/to/project --rules=@PSR2, full_opening_tag, indentation_type

Чтобы каждый раз не передавать --rules, создадим конфигурационный файл .php_cs в корне проекта, в котором перечислим набор правил.

Пример базового файла с настройками. 

<?php return PhpCsFixer\Config::create() ->setRules([ '@PSR2' => true, 'strict_param' => true, 'array_syntax' => ['syntax' => 'short'], ]) ->setUsingCache(false) ->setFinder( PhpCsFixer\Finder::create() ->in(__DIR__) ); ;

setRules задает набор правил оформления. Список доступных правил описан здесь.

setUsingCache ускоряет выполнение программы, запоминая время и список файлов, чтобы в следующий раз при запуске исправлять только те файлы, которые менялись. 

setFinder определяет папку, в которой будут исправлены файлы. Если нужно исключить папку, то для этого добавляется параметр exclude('somedir')

Теперь при запуске скрипта применятся набор правил оформления, заданный в .php_cs. Пример исходного файла до автоисправления

class Auth { const SUPPORTED_TYPES = ['Bearer']; const SOME_ARRAY = array(); /** * Authenticate user by JWT * @param Request $req * @param Response $res * @param $next * @return Response - with 403 status if auth failed */ public function jwt(Request $req, Response $res, $next): Response { try { $authHeader = $req->getHeader('Authorization'); if ( empty($authHeader[0]) ) { throw new AuthException("HTTPAuth header is missing"); } Log::instance()->notice($authHeader[0]); ..... }

Исправленный файл

class Auth { const SUPPORTED_TYPES = ['Bearer']; const SOME_ARRAY = []; // array заменили на [] /** * Authenticate user by JWT * * @param Request $req * @param Response $res * @param $next * * @return Response - with 403 status if auth failed */ public function jwt(Request $req, Response $res, $next): Response { try { $authHeader = $req->getHeader('Authorization'); if (empty($authHeader[0])) { throw new AuthException('HTTPAuth header is missing'); } Log::instance()->notice($authHeader[0]); ..... }

Удобство восприятия — важное качество создаваемого кода. Эффективность командной работы повышается, когда все разработчики пишут в едином стиле. Изучать сторонние библиотеки и решения проще, если их код соответствует стандартам. 

Следить за оформлением и автоматически исправлять ошибки помогают скрипты, такие как PHP CS Fixer. Также рекомендуется настроить автоматическую проверку стиля в своей среде разработки. Об этом поговорим в следующих статьях.