Ответ
В моей работе над 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:
- Локально: Запускаю
PHP-CS-Fixerдля автоматического форматирования иPHPStan/Psalmна среднем уровне строгости перед коммитом. - В CI (например, GitHub Actions): Запускаю полную батарею тестов:
PHPStanна максимальном уровне,Psalm,PHPCSи юнит-тесты. Пайплайн не проходит, если анализаторы находят критические ошибки.
Эти инструменты значительно повышают качество кода, отлавливая ошибки на этапе написания, а не в runtime.