PHP: Линтер

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

Единый стиль означает код, одинаково понятный всем членам команды, независимо от того, кто его написал. Это экономит время, снижает количество ошибок и упрощает совместную работу.

Стандарты кодирования

В PHP самыми распространенными являются стандарты PSR — PHP Standards Recommendations или стандартные рекомендации PHP от PHP-FIG. Это набор правил, которые облегчают разработку и решают определенную проблему.

На текущий момент существует несколько утвержденных рекомендаций, каждая из них обозначена цифрой: PSR-1, PSR-2, PSR-3 и другие. Со всеми рекомендациями вы познакомитесь во время обучения и работы. В этом уроке разберем подробнее следующие:

  • PSR-1. Basic Coding Standard — базовый стандарт написания кода. Это набор правил, которые определяют, как следует оформлять программный код: как писать теги PHP, по каким правилам именовать классы, методы и константы классов. Он также затрагивает вопросы кодировки, автозагрузки, пространства имен и разделения ответственности между файлами
  • PSR-12. Extended Coding Style — расширенный стандарт стиля кодирования, заменяет и дополняет устаревший PSR-2. Этот стандарт требует выполнения правил PSR-1. Также он добавляет множество новых требований: к отступам, файлам, строкам, ключевым словам, классам, управляющим конструкциям, области видимости и другим элементам

Эти стандарты знают и используют все PHP-разработчики. Новичкам полезно время от времени заглядывать в них и вырабатывать правильные привычки с самого начала. Однако запоминать все сразу нет необходимости.

Линтеры: автоматическая проверка кода

Запоминать все правила вручную не нужно. Существуют специальные программы, которые делают это за вас. Они называются линтеры.

Линтер представляет собой инструмент, который анализирует ваш код и сообщает о нарушениях стандартов. Он помогает:

  • Избавиться от лишних пробелов
  • Соблюдать отступы
  • Писать читаемые и красивые выражения

В мире PHP широко используются два инструмента: PHP_CodeSniffer, который проверяет код на соответствие стандартам, и PHP CS Fixer, который умеет не только находить нарушения, но и исправлять их автоматически. В этом курсе используется PHP CS Fixer.

Рассмотрим пример:

<?php

print_r(1+ 3);

Такой код выглядит неаккуратно, и линтер справедливо укажет на ошибку. Вот как выглядит процесс проверки:

Код               Линтер             Результат
┌────────────┐    ┌──────────────┐    ┌──────────────────────┐
│ print_r(   │ →  │ PHP CS Fixer │ →  │ binary_operator_     │
│   1+ 3)    │    │              │    │ spaces               │
└────────────┘    └──────────────┘    └──────────────────────┘

Это значит, что перед и после + не хватает пробелов. Согласно стандарту, должно быть так:

<?php

print_r(1 + 3);

Правила и их смысл

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

<?php

// На следующей строке отступ равен одному табу
	print_r (((8 / 2) + 5) - (-3 / 2));

?>

При проверке файла линтер найдет следующие ошибки:

  • Spaces must be used to indent lines; tabs are not allowed — PSR-12 рекомендует делать отступ размером в четыре пробела, а в примере выше использована табуляция
  • A closing tag is not permitted at the end of a PHP file — стандарт содержит требование опускать завершающий тег ?>
  • Space before opening parenthesis of function call prohibited — при вызове функции между именем функции и круглыми скобками не должно быть пробельных символов, а в проверяемом коде после имени print_r стоит один пробел

Исправим код — уберем закрывающий тег, отступы и пробел после имени функции:

<?php

print_r(((8 / 2) + 5) - (-3 / 2)); // => 10.5

Этот вариант уже не нарушает правил, и линтер будет «молчать». Когда вы только начинаете, такие мелочи могут казаться неважными. Но со временем становится понятно, что именно они формируют единый читаемый стиль.

Использование линтера в своих проектах

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

Задание

Вы получили код от коллеги — он работает правильно, но нарушает стандарт оформления PSR-12. Исправьте пробелы вокруг операторов, не меняя логику:

<?php

print_r(    (5  **2)-(3*  7));

Результат должен остаться 4.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются