Функции статических анализаторов PHP

В предыдущей статье о статическом анализе в 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:

Минусы у Psalm безусловно должны быть. Но все познает в сравнении. В сравнении с предыдущими двумя инструментамии, этот пока выглядит более развитым. Напишите, пожалуйста, в комментариях, какие минусы этого инструмента видите вы.

Статические анализаторы кода требуют времени для освоения, но позволяют разработчику сократить количество допускаемых ошибок. Такая работа несомненно окупится.

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *