Что такое статический анализ кода (PHPStan, Psalm)?php-57

Статический анализ кода — это процесс автоматизированной проверки исходного кода без его выполнения, направленный на выявление ошибок, потенциальных уязвимостей и отклонений от best practices. В PHP для этого используются инструменты вроде PHPStan и Psalm.

Как это работает

Анализаторы:

  1. Сканируют код как абстрактное синтаксическое дерево (AST)
  2. Проверяют типы, сигнатуры методов, DocBlock-аннотации
  3. Анализируют поток данных и возможные состояния программы
  4. Сравнивают код с заданными правилами (rule sets)

Пример кода с проблемой, которую выявит статический анализ:

function calculate(int $a, int $b): int {
    return $a + $b;
}

calculate("5", "10"); // Psalm/PHPStan обнаружат несоответствие типов

Ключевые возможности PHPStan/Psalm

  • Вывод типов: Автоматическое определение типов там, где они не указаны
  • Проверка аннотаций: Сравнение PHPDoc с фактическим использованием
  • Обнаружение мертвого кода: Неиспользуемые классы, методы, свойства
  • Поиск SQL-инъекций: Анализ строковых параметров запросов
  • Проверка исключений: Контроль неперехваченных исключений

Уровни строгости

PHPStan использует уровни (0-9), где:

  • Уровень 0: Базовые проверки (синтаксис, существование классов)
  • Уровень 9: Полный анализ с strict rules (например, точная проверка array shapes)

Интеграция в workflow

// phpstan.neon
parameters:
    level: 8
    paths:
        - src
    excludePaths:
        - tests/*

Отличия Psalm от PHPStan

  1. Psalm изначально заточен под type checking
  2. Имеет встроенную поддержку шаблонов (templates)
  3. Может автоматически исправлять некоторые ошибки
  4. Лучше работает с массивоподобными структурами

Практическая польза

  • На 30-50% сокращает время code review
  • Позволяет обнаружить ошибки до попадания в production
  • Форсирует единый стиль кода в команде
  • Служит документацией ожидаемого поведения (через аннотации)

Резюмируем:

статический анализ — это "линтинг на стероидах", который превращает PHP в более строго типизированный язык, существенно повышая надежность кодовой базы. Инструменты вроде PHPStan/Psalm стали must-have для профессиональных PHP-проектов.