Как перестать бояться динамической типизации в PHP и начать спать спокойно
Знаете это чувство, когда выкатываешь фикс в пятницу вечером, а через пять минут прилетает уведомление о TypeError? В PHP это классика: кто-то передал null туда, где ждали строку, или массив внезапно оказался объектом. Даже с появлением строгой типизации в последних версиях языка, мы всё равно остаёмся заложниками динамической природы PHP. Именно здесь на сцену выходит Psalm — инструмент, который заставляет ваш код вести себя так, будто он написан на языке со строгой статической типизацией.
Что это вообще такое
Psalm — это статический анализатор, рожденный в недрах Vimeo. Его основная задача — находить ошибки в коде еще до того, как вы его запустите. Если PHPStan (другой популярный анализатор) кажется вам слишком мягким или вы хотите выжать максимум безопасности из своего проекта, Psalm — ваш выбор. Он не просто проверяет типы, он буквально «просеивает» логику приложения через сито строгих правил.
Чем Psalm полезен на практике
Многие думают, что статический анализ — это просто проверка int или string. На самом деле возможности Psalm куда шире.
Поиск логических дыр и неиспользуемого кода
Psalm видит то, что пропускает глаз разработчика. Например, он подсветит условия, которые всегда возвращают true или false. Если вы написали проверку if ($a && $a), анализатор вежливо намекнет, что здесь что-то не так. То же самое касается неиспользуемых переменных, методов или даже целых классов. Это помогает держать кодовую базу в чистоте без лишних усилий.
Безопасность и Taint-анализ
Это одна из самых крутых фишек проекта. Psalm умеет отслеживать путь данных от пользовательского ввода до «опасных» функций (например, SQL-запросов или вывода в HTML). Если вы забыли экранировать данные из $_GET, Psalm поднимет тревогу. Это позволяет ловить потенциальные XSS и SQL-инъекции на этапе написания кода, а не после аудита безопасности.
Работа с типами на стероидах
В PHPDoc мы часто пишем array. Но что внутри этого массива? Psalm позволяет описывать структуры данных максимально подробно: array<int, User>, list<string> или даже сложные формы массивов через синтаксис array{id: int, name: string}. Это дает автодополнение и проверку типов такого уровня, который раньше был доступен только в Java или C#.
Автоматическое исправление ошибок
Инструмент поставляется с утилитой psalter. Она умеет автоматически исправлять некоторые найденные ошибки. Например, если Psalm уверен в типе переменной, он может сам проставить нужные тайп-хинты в коде. Это экономит кучу времени при рефакторинге старых проектов.
Техническая сторона вопроса
Psalm написан на самом PHP, что делает его установку через Composer делом пары минут. Внутри он строит абстрактное синтаксическое дерево (AST) и анализирует потоки данных.
Интересная особенность — уровни строгости. Их всего восемь. Первый уровень — самый жесткий, где любая недосказанность в типах считается ошибкой. Восьмой уровень позволяет внедрять инструмент в легаси-проекты постепенно, не сходя с ума от тысяч предупреждений в первый же день.
Как начать пользоваться
Если вы решите попробовать, алгоритм простой:
- Устанавливаете пакет через Composer.
- Инициализируете конфиг командой
vendor/bin/psalm --init. На этом этапе вы выбираете уровень строгости. - Запускаете проверку.
Для тех, кто не хочет сразу тащить пакет в проект, на официальном сайте есть Live Demo. Там можно вставить свой кусок кода и посмотреть, что о нем думает анализатор.
Стоит ли оно того
Я часто сталкиваюсь с мнением, что статический анализ замедляет разработку. В краткосрочной перспективе — возможно, ведь приходится тратить время на описание типов. Но в долгосроке это окупается сторицей.
Psalm особенно пригодится:
- В больших командах, где важно соблюдать единообразие кода.
- В проектах с высокими требованиями к безопасности.
- При рефакторинге старого кода, когда страшно что-то сломать.
Конечно, документация местами может показаться сухой, а настройка под специфические фреймворки (вроде Laravel или Symfony) потребует установки дополнительных плагинов. Но результат в виде чистого, предсказуемого и безопасного кода того стоит. Если вы еще не используете статический анализ в PHP — Psalm отличный повод начать.
