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

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

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

  • Базовые проверки, определение неизвестных классов, функций и методов ($this), неопределённых переменных, а также передачи неверного числа аргументов.
  • Выявление вероятно неопределённых переменных, неизвестных magic-методов и свойств классов с __call и __get.
  • Выявление неизвестных методов во всех выражениях, не ограничиваясь вызовом через $this. Проверка PHPDocs.
  • Проверка возвращаемых типов и назначения типов свойствам.
  • Базовое выявление «мёртвого» (никогда не вызываемого) кода. Выявление вызовов instanceof всегда возвращающих значение false, никогда не срабатывающих блоков «else» и кода, находящегося после return.
  • Проверка типов аргументов, передаваемых в методы и функции.
  • Предупреждение об отсутствии аннотаций с информацией о типах.
  • Предупреждение о некорректных union-типах, определяющих коллекции из двух и более типов.
  • Предупреждение о вызове методов и доступе к свойствам с типами «nullable».
  • Проверка использования типа «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 типы из сообщений об ошибках.

    Источник: opennet.ru