Какие линтеры и статические анализаторы ты использовал в PHP-проектах?

Ответ

В PHP-проектах я настраиваю и использую комплекс инструментов для статического анализа, чтобы поддерживать высокое качество кода на ранних этапах.

Основной стек:

  1. PHP_CodeSniffer (PHPCS) + PHP-CS-Fixer. Первый — для проверки, второй — для автоматического исправления стиля кода. Использую стандарт PSR-12 и кастомные правила проекта. Конфигурация в phpcs.xml.dist:

    <?xml version="1.0"?>
    <ruleset name="MyProject">
        <rule ref="PSR12"/>
        <rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint"/>
        <file>src</file>
        <file>tests</file>
        <exclude-pattern>*/vendor/*</exclude-pattern>
    </ruleset>
  2. PHPStan. Запускаю на максимальном уровне (level: 9) для строгого контроля типов и поиска скрытых ошибок. Интегрирую его в CI/CD пайплайн, чтобы проверка была обязательным этапом.

    # phpstan.neon
    parameters:
        level: max
        paths:
            - src
        checkMissingIterableValueType: false
  3. Psalm. Использую в дополнение к PHPStan в некоторых проектах, так как он предлагает уникальные проверки, особенно для аннотаций типов в PHPDoc и поиска возможных SQL-инъекций.

Интеграция в процесс: Я настраиваю скрипты в composer.json, чтобы команды были стандартизированы для всех разработчиков:

{
    "scripts": {
        "cs-check": "phpcs",
        "cs-fix": "phpcbf",
        "stan": "phpstan analyse",
        "analyse": ["@cs-check", "@stan"]
    }
}

Запуск composer analyse выполняет всю цепочку проверок. Это позволяет отлавливать проблемы до коммита и код-ревью, значительно экономя время команды.

Ответ 18+ 🔞

Ну ты представляешь, какая история — сидишь ты такой, пишешь код, а потом раз — и на тебе, в прод вылезает какая-нибудь дичь, потому что кто-то забыл проверить тип переменной. Ёпта, я с этим бороться начал, как Шерлок Холмс с преступностью. Настроил себе целый арсенал, чтобы код был не просто рабочий, а чтоб блестел, сука, как жопа у младенца.

Вот мой основной набор для выноса мозга коду:

  1. PHP_CodeSniffer (PHPCS) + PHP-CS-Fixer. Первый — это как злой завхоз, который ходит и тычет палкой: «Ага, тут отступ не четыре пробела, а три! Пиздец!». А второй — его брат-близнец, но с отвёрткой, который сразу всё и чинит. Я им говорю — живите по стандарту PSR-12, и не рыпайтесь. Конфиг у меня в phpcs.xml.dist лежит, простой как три копейки:

    <?xml version="1.0"?>
    <ruleset name="MyProject">
        <rule ref="PSR12"/>
        <rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint"/>
        <file>src</file>
        <file>tests</file>
        <exclude-pattern>*/vendor/*</exclude-pattern>
    </ruleset>

    Главное — не забыть выпихнуть папку vendor, а то он там начнёт ворчать на чужие библиотеки, ядрана вошь.

  2. PHPStan. А вот это, блядь, мой главный каратель. Ставлю ему уровень сложности на максимум (level: 9), и он начинает копать так, будто ищет клад в твоём коде. Находит такое, от чего сам от себя охуеешь — типы не те, возможные null'ы, где их быть не должно. Просто терпения ноль ебать у этой штуки. Кидаю его в CI/CD, чтобы ни одна строчка не проскочила без досмотра.

    # phpstan.neon
    parameters:
        level: max
        paths:
            - src
        checkMissingIterableValueType: false
  3. Psalm. Его я подключаю иногда, когда чувствую, что PHPStan отдохнул. У него свой взгляд на вещи, особенно он любит поковыряться в PHPDoc'ах и порыскать, нет ли где случайной SQL-инъекции, которую все проглядели. Два таких детектива — надёжнее.

Как я это всё в дело впариваю: А хитрая жопа-то в чём? В том, чтобы никто не забыл этим пользоваться. Я в composer.json прописываю скрипты, и всё — приказ команде.

{
    "scripts": {
        "cs-check": "phpcs",
        "cs-fix": "phpcbf",
        "stan": "phpstan analyse",
        "analyse": ["@cs-check", "@stan"]
    }
}

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