После шести лет разработки состоялся первый стабильный релиз статического анализатора PHPStan 1.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Код проекта написан на языке PHP и распространяется под лицензией MIT.
Анализатор предоставляет 10 уровней проверки, в которых каждый последующий уровень расширяет возможности предыдущего и предоставляет более строгие проверки:
Примеры выявляемых базовых проблем:
- Существование классов, используемых в 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