Какие статические анализаторы кода вы знаете?

Ответ

В моей работе над PHP-проектами статические анализаторы — неотъемлемая часть CI/CD пайплайна. Вот основные инструменты, которые я использовал:

1. PHPStan

  • Мощный анализатор, который находит ошибки без запуска кода. Работает по принципу уровней (0-9), где 0 — базовые проверки, а 9 — максимальная строгость.
  • Пример из реального проекта: На уровне 6 он отловил потенциальную ошибку, когда метод мог вернуть null, но тип возвращаемого значения был объявлен как string.

    // .phpstan.neon конфигурация
    parameters:
        level: 6
        paths:
            - src
    
    // Код, который PHPStan проанализирует
    /**
     * @return array<int, string>
     */
    function getNames(): array {
        // ...
    }

2. Psalm

  • Анализатор с акцентом на систему типов. Отлично работает с phpDoc-аннотациями и умеет выводить типы сам.
  • Пример: Psalm помог найти места, где передавался неверный тип аргумента в стороннюю библиотеку.

    // Psalm понимает аннотации и проверяет соответствие
    /** @psalm-param non-empty-string $id */
    function processId(string $id): void { /* ... */ }
    
    processId(''); // Psalm выдаст ошибку: Argument 1 of processId expects a non-empty-string, empty string provided

3. PHP_CodeSniffer (PHPCS) + PHP-CS-Fixer

  • PHPCS проверяет код на соответствие стандартам кодирования (PSR-1, PSR-12, собственные).
  • PHP-CS-Fixer автоматически исправляет нарушения стиля.
  • Как я их использую: В composer.json добавляю скрипты для предкоммитных проверок.
    "scripts": {
        "cs-check": "phpcs --standard=PSR12 src tests",
        "cs-fix": "php-cs-fixer fix src"
    }

4. Phan

  • Ещё один статический анализатор, который проводит глубокий анализ. Может быть медленнее, но иногда находит проблемы, которые пропускают другие.

Мой типичный workflow:

  1. Локально: Запускаю PHP-CS-Fixer для автоматического форматирования и PHPStan/Psalm на среднем уровне строгости перед коммитом.
  2. В CI (например, GitHub Actions): Запускаю полную батарею тестов: PHPStan на максимальном уровне, Psalm, PHPCS и юнит-тесты. Пайплайн не проходит, если анализаторы находят критические ошибки.

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

Ответ 18+ 🔞

Ну слушай, история про статические анализаторы в PHP — это вообще отдельный вид искусства, ёпта. Представь себе: ты пишешь код, вроде всё летает, а потом включаешь эту штуку и понимаешь, что ты не программист, а мартышлюшка с клавиатурой. Серьёзно, волнение ебать — как будто на экзамене, когда училка смотрит в твою тетрадь.

Вот PHPStan, например. Эта штука работает по уровням, от нуля до девяти. На нуле она тебе скажет: «О, чувак, тут у тебя переменная не определена, ты чё, охренел?» А на девятом уровне она уже так вникает в твои типы и зависимости, что у меня иногда терпения ноль ебать — сидишь и думаешь: «Э, бошка, думай! Какого хуя он тут требует nullable, я же вроде всё проверил?» Но зато потом находишь места, где метод в теории может вернуть null, а ты его как строку используешь. И ты такой: «Ни хуя себе, а ведь в проде бы всё накрылось медным тазом при определённых условиях».

А Psalm — это вообще хитрая жопа. Он с типами работает так, будто у него докторская по твоему коду. Ты ему намекни через phpDoc, что строка должна быть непустой, и он тебя потом за каждую пустую строчку так впендюрит, что сразу понятно — доверия ебать ноль к твоим проверкам. Видел раз, как он на пустом аргументе ругался? Типа: «Ты куда эту пустоту суёшь, сюда же non-empty-string нужен!» И ведь прав, сука.

Но самое весёлое начинается, когда подключаешь PHP_CodeSniffer и PHP-CS-Fixer. Первый — это такой занудный перфекционист, который ходит и тычет пальцем: «У тебя тут пробела не хватает, а тут скобка не на той строке, а тут, бля, camelCase нарушен!» А второй — это его брат-близнец, но с правом на силу. Ты ему команду дал, а он взял и всё сам поправил. Красота же! В composer.json скрипты прописываешь, и перед коммитом просто composer cs-fix запускаешь — и вуаля, код уже не позорно выглядит. А то ведь бывает напишешь в спешке — и в репозиторий летит пизда рулю, форматирования никакого.

Phan я тоже пробовал. Мощная штука, глубоко копает, но иногда такая медленная, что пока он работает, можно сходить чайку попить, бутерброд сделать и вернуться — а он всё ещё думает. Но зато иногда выдает такие перлы, на которые другие внимания не обращают.

В общем, мой воркфлоу теперь выглядит так. Локально, перед тем как закоммитить, я гоняю фиксер и лёгкие проверки. А в CI, на сервере, уже включается полный ад: PHPStan на максимуме, Psalm, PHPCS и все тесты. И если что-то не проходит — пайплайн ломается, и ты сидишь и думаешь: «Какого хуя?» Ищешь ошибку, чинишь. Зато потом живешь спокойно, потому что знаешь, что хотя бы часть откровенного говна в рантайм не вылезет. Эти инструменты — они как строгие, но справедливые учителя: сначала бесишься, а потом спасибо им говоришь, что не дали тебе в проде ебушки-воробушки устроить.