Ответ
В моей работе над 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.
Ответ 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 и все тесты. И если что-то не проходит — пайплайн ломается, и ты сидишь и думаешь: «Какого хуя?» Ищешь ошибку, чинишь. Зато потом живешь спокойно, потому что знаешь, что хотя бы часть откровенного говна в рантайм не вылезет. Эти инструменты — они как строгие, но справедливые учителя: сначала бесишься, а потом спасибо им говоришь, что не дали тебе в проде ебушки-воробушки устроить.