Функции статических анализаторов 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 безусловно должны быть. Но все познает в сравнении. В сравнении с предыдущими двумя инструментамии, этот пока выглядит более развитым. Напишите, пожалуйста, в комментариях, какие минусы этого инструмента видите вы.

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

Leave a Reply

Ваш адрес email не будет опубликован.