Стили кодирования (PHP линтеры)

Разберем что такое и для чего нужны PHP линтеры, рассмотрим два самых популярных линтера для PHP, установим и запустим, а так же настроим их для VSCode, PhpStorm и Git.

Оглавление статьи

  1. Вводная информация
  2. О стандарте кодирования в PHP
  3. Перечень стандартов
  4. Зависимости линтеров
  5. PHP CodeSniffer
  6. PHP CS Fixer
  7. Pre Commit
  8. Автоматическая проверка кода

Вводная информация

В предыдущих статьях мы настроили редактор кода VSCode и IDE PhpStorm для комфортной работы. Эта статья является вводным началом раздела Стили кодирования (PHP линтеры) перечисленных выше статей.

О стандарте кодирования в PHP

Линтер - это инструмент позволяющий коду соответствовать заданным правилам, стандартам, строгому стилю кодирования. При использовании в IDE и редакторах кода подсвечивает некорректный правилам код, а так же автоматически исправляет его при возможности.

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

Не нужно ставить сразу два линтера, выберете какой-то один.

Перечень стандартов

PSR-1 - базовый стандарт кодирования

PSR-2 - устарел

PSR-4- автозагрузчик (namespace)

PSR-12 - расширенный стиль кодирования

PER Coding Style - улучшение PSR-12

Чистый код - стайл гайд для PHP

Зависимости линтеров

Для работы с линтерами необходимо установить следующие зависимости.

PHP
sudo apt install php-xml php-xmlrpc

PHP CodeSniffer

Инструкция по установке PHP CodeSniffer написана в официальном репозитории.

Установка в корень проекта

PHP CodeSniffer будет работать только с проектом в который установлен.

BASH
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar

# ИЛИ

composer require "squizlabs/php_codesniffer=*"

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

PHP CodeSniffer будет работать с любым проектом.

На вопрос Do you want to re-run the command with --dev? отвечаем yes.

BASH
composer global require squizlabs/php_codesniffer

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

Для того, чтобы узнать куда был установлен PHP CodeSniffer.

BASH
composer global config bin-dir --absolute

Запуск CodeSniffer

Стандартом кодирования по умолчанию в PHP_CodeSniffer является PEAR.

Что бы проверить файлы на соответствие стандарту выполните следующие команды.

BASH
# phpcs покажет ошибки
./vendor/bin/phpcs /path/to/code-directory

# phpcbf исправит ошибки
./vendor/bin/phpcbf /path/to/code-directory

# ИЛИ

~/.config/composer/vendor/bin/phpcs /path/to/code-directory
~/.config/composer/vendor/bin/phpcbf /path/to/code-directory

Переопределение стандарта PHP_CodeSniffer с PEAR на PSR-12

Чтобы проверить файл по стандарту кодирования PSR-12, добавьте следующую опцию --standard=PSR12.

BASH
phpcs --standard=PSR12 /path/to/code-directory
phpcbf --standard=PSR12 /path/to/code-directory

PHP CS Fixer

Инструкция по установке PHP CS Fixer написана на официальном сайте.

Установка в корень проекта

PHP CS Fixer будет работать только с проектом в который установлен.

BASH
curl -L https://cs.symfony.com/download/php-cs-fixer-v3.phar -o php-cs-fixer

# ИЛИ

composer require friendsofphp/php-cs-fixer

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

PHP CS Fixer будет работать с любым проектом.

На вопрос Do you want to re-run the command with --dev? отвечаем yes.

BASH
composer global require friendsofphp/php-cs-fixer

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

Для того, чтобы узнать куда был установлен PHP CS Fixer.

BASH
composer global config bin-dir --absolute

Запуск PHP CS Fixer

Что бы проверить файлы на соответствие стандарту выполните следующие команды.

BASH
php php-cs-fixer fix /path/to/dir
php php-cs-fixer fix /path/to/file

# ИЛИ

php ~/.config/composer/vendor/bin/php-cs-fixer fix /path/to/dir
php ~/.config/composer/vendor/bin/php-cs-fixer fix /path/to/file

# Опции:
--dry-run - проверка без исправлений
--using-cache=no - не учитывать предыдущую проверку

# Например
php php-cs-fixer fix /path/to/dir --dry-run

Pre Commit

Чем хороши линтеры тем что позволяют проверить код на соответствие определенным правилам и если код им не соответствует исправить его либо оповестить о проблемах. К данной функциональности можно так же добавить проверку кода перед созданием коммита в git и если найдется ошибка коммит не состоится. Что позволит поддерживать о единообразии кода как на локальном компьютере, так и на удаленном репозитории.

Создадим файл хука Pre Commit и напишем в нем некоторую программную логику которая будет срабатывать при определенных действиях. В данном случае наш хук будет срабатывать при создании коммита.

Создадим хук введя команду. Необходимо, чтобы в проекте был проинициализирован Git.

BASH
cp .git/hooks/pre-commit.sample .git/hooks/pre-commit

Pre Commit для PHP_CodeSniffer

Не забудьте изменить username в пути на имя своего пользователя.

Содержимое созданного файла если нужно автоматическое исправление кода.

BASH
#!/bin/sh

if [ -f /home/username/.config/composer/vendor/bin/phpcbf ]
then
  /home/username/.config/composer/vendor/bin/phpcbf ./
  if [ $? -ne 0 ]
  then
    RED='\033[0;31m'
    CYAN='\033[0;36m'
    NA='\033[0m'

    printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"

    return 1
  fi
fi

Содержимое созданного файла если не нужно автоматическое исправление кода.

BASH
#!/bin/sh

if [ -f /home/username/.config/composer/vendor/bin/phpcs ]
then
  /home/username/.config/composer/vendor/bin/phpcs ./
  if [ $? -ne 0 ]
  then
    RED='\033[0;31m'
    CYAN='\033[0;36m'
    NA='\033[0m'

    printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"

    return 1
  fi
fi

Pre Commit для PHP CS Fixer

Не забудьте изменить username в пути на имя своего пользователя.

Содержимое созданного файла если нужно автоматическое исправление кода.

BASH
#!/bin/sh

if [ -f /home/username/.config/composer/vendor/bin/php-cs-fixer ]
then
  /home/username/.config/composer/vendor/bin/php-cs-fixer fix --quiet --using-cache=no ./
  if [ $? -ne 0 ]
  then
    RED='\033[0;31m'
    CYAN='\033[0;36m'
    NA='\033[0m'

    printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"

    return 1
  fi
fi

Содержимое созданного файла если не нужно автоматическое исправление кода.

BASH
#!/bin/sh

if [ -f /home/username/.config/composer/vendor/bin/php-cs-fixer ]
then
  /home/username/.config/composer/vendor/bin/php-cs-fixer fix --dry-run --quiet --using-cache=no ./
  if [ $? -ne 0 ]
  then
    RED='\033[0;31m'
    CYAN='\033[0;36m'
    NA='\033[0m'

    printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"

    return 1
  fi
fi

Автоматическая проверка кода

Узнайте как настроить редактор кода VSCode или IDE PhpStorm на автоматическую проверку кода линтерами.

Предыдущая статья Настройка Visual Studio Code Следующая статья Установка и настройка Xdebug для отладки PHP кода