В предыдущей статье о статическом анализе в php о таких инструментах было рассказано совсем мало. В этой будет сделена попытка углубиться и получить больше информации о том, какие возможности они дают.
Содержание статьи
Основные функции статических анализаторов
Как было сказано ранее, основные функции, которые имеются у всех таких анализаторов – проверка на сущесвотвание переменных, функций и классов. А также – проверка соотвествия параметров и типов при вызове функции. При таком анализе используются либо объявления типов, которые появились в php с версии 7.4, либо комментари phpdoc, которые позволяли описывать код php (включая типы) гибче и раньше, чем штатные возможности языка.
В php 8 появилась возможность объединения типов. Это используется в случаях, когда переменная может принимать значения разных типов. Однако с phpdoc это можно было использовать и до версии 8. Статические анализаторы умеют правильно работать и с объединениями типов.
В php часто используются массивы не как набор величин строго одного типа с числовыми индексами, а как тип “запись”. Вы можете описать структуру массива, а инструменты для статического анализа могут проверять и его. Такое описание называется Array shapes.
Такого рода проверки типов – и есть основная работа инструментов статического анализа. Но ряд имеющихся решений делают больше. Ряд решений просто делают это удобнее в использовании.
PhpStan
Очень популярным инструментом статического анализа является PhpStan. Он прост в установке настройке умеет конечно все базовые вещи, о которых писалось выше.
У него имеются следующие положительные стороны:
- Умеет анализировать указанную часть файлов в кодовой базе (тоесть не обязательно анализировать весь проект). Главное, чтобы классы подключались через autoload и PhpStan подключит все необходимые для анализа классы.
- Поддерживает собсвенные PHPDoc-теги (свое пространство имен) типа
@phpstan-property
,@phpstan-property-read
и@phpstan-property-write
. Они полезны при использовании более одного анализатора в проекте. - Можно описывать шаблоны типов подобно дженерикам (generics) java
- Имеет плагины для анализа кода, который написан с ипользованием определенных фреймворков (Laravel, Symfony, Mockery и др.).
И минусы:
- Нет типов ошибок. При ошибках выводит только текст
Phan
Phan – достаточно интересный инструмент. Он выделяется среди прочих тем, что не выполняет php код, а просто парсит кодовую базу и строит aбстрактное синтаксическое дерево (AST дерево). За счет этого он работает достаточно быстро. Но с этим связан и один из его недостатков. В синтаксическом дереве нет информации о phpdoc комментариях внутри функций (методов). Поэтому при проверках могут иметь место ложные срабатывания.
Плюсы Phan:
- Работает быстро
- Имеет типы ошибок
Минусы:
- Имеет ложные срабатывания из-за недоступности всех комментариев phpdoc в AST дереве
- Нет поддержки собственных PHPDoc-тегов
- Нет списка всех типов ошибок
Psalm
Psalm по принципу работы похож на PhpStan – ему можно указать список файлов для проверки, а все нужные классы Psalm подключит через autoload.
Плюсы Psalm:
- Имеет типы ошибок и список типов описан
- Может анализировать часть кодовой базы
- Поддерживает собсвенные PHPDoc-теги (свое пространство имен), которые расширяют возможности
- При выводе ошибок показывает строки кода, где они были найдены
- Можно описывать шаблоны типов подобно дженерикам (generics) java
- Есть плагины psalm под различные фреймворки: Laravel, Symfony, Mockery и т.д.
Минусы у Psalm безусловно должны быть. Но все познает в сравнении. В сравнении с предыдущими двумя инструментамии, этот пока выглядит более развитым. Напишите, пожалуйста, в комментариях, какие минусы этого инструмента видите вы.
Полезные ссылки
Статические анализаторы кода требуют времени для освоения, но позволяют разработчику сократить количество допускаемых ошибок. Такая работа несомненно окупится.