Выпуск PHPStan 1.0, статического анализатора для кода на языке PHP

После шести лет разработки состоялся первый стабильный релиз статического анализатора PHPStan 1.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Код проекта написан на языке PHP и распространяется под лицензией MIT.

Анализатор предоставляет 10 уровней проверки, в которых каждый последующий уровень расширяет возможности предыдущего и предоставляет более строгие проверки:

  1. Базовые проверки, определение неизвестных классов, функций и методов ($this), неопределённых переменных, а также передачи неверного числа аргументов.
  2. Выявление вероятно неопределённых переменных, неизвестных magic-методов и свойств классов с __call и __get.
  3. Выявление неизвестных методов во всех выражениях, не ограничиваясь
    вызовом через $this. Проверка PHPDocs.
  4. Проверка возвращаемых типов и назначения типов свойствам.
  5. Базовое выявление “мёртвого” (никогда не вызываемого) кода. Выявление вызовов instanceof всегда возвращающих значение false, никогда не срабатывающих блоков “else” и кода, находящегося после return.
  6. Проверка типов аргументов, передаваемых в методы и функции.
  7. Предупреждение об отсутствии аннотаций с информацией о типах.
  8. Предупреждение о некорректных union-типах, определяющих коллекции из двух и более типов.
  9. Предупреждение о вызове методов и доступе к свойствам с типами, принимающими значение null.
  10. Проверка использования типа “mixed”.

Примеры выявляемых базовых проблем:

  • Существование классов, используемых в instanceof, catch, typehints и других языковых конструкциях.
  • Существование и доступность вызываемых методов и функций, а также числа передаваемых аргументов.
  • Проверка возвращения методом данных с тем же типом, что определён в выражении return.
  • Существование и видимость свойств, к которым выполняется обращение, а также проверка объявленных и фактических типов данных, используемых в свойствах.
  • Корректность числа параметров, переданных в вызовы sprintf/printf в блоке форматирования строк.
  • Существование переменных с учётом блоков, формируемых операторами ветвления и циклами.
  • Бесполезные приведения типов (например, “(string) ‘foo'”) и строгие проверки (“===” и “!==”) данных с разными типами и операндами всегда возвращающими значение false.

Ключевые новшества PHPStan 1.0:

  • Реализован уровень проверки “9”, осуществляющий проверки использования типа “mixed”, предназначенного для организации приёма функцией параметров с разными типами. Девятый уровень выявляет небезопасные приёмы использования “mixed”, такие как передача значений с типом “mixed” другому типу, вызов методов с типом “mixed” и обращение к его свойствам, так как они могут не существовать.
  • Управление проверкой идентичности возвращаемых значений для одинаковых вызовов функций с использованием аннотаций @phpstan-pure и @phpstan-impure.
  • Анализ типов в конструкциях try-catch-finally с использованием аннотаций @throws.
  • Выявление определённых, но неиспользуемых внутренних (private) свойств, методов и констант.
  • Передача несовместимых callback-вызовов в функции работы с массивами, такие как array_map и usort.
  • Инспектирование типов для отсутствующих typehint-аннотаций.
  • Обеспечена совместимость описаний типов с PHPDocs, что позволяет использовать в PHPDocs типы из сообщений об ошибках.
Release. Ссылка here.