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

«Какие статические анализаторы кода вы знаете?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей работе над 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.