После шести лет разработки состоялся первый стабильный релиз статического анализатора PHPStan 1.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Код проекта написан на языке PHP и распространяется под лицензией MIT.
Анализатор предоставляет 10 уровней проверки, в которых каждый последующий уровень расширяет возможности предыдущего и предоставляет более строгие проверки:
Анализатор предоставляет 10 уровней проверки, в которых каждый последующий уровень расширяет возможности предыдущего и предоставляет более строгие проверки:
- Базовые проверки, определение неизвестных классов, функций и методов ($this), неопределённых переменных, а также передачи неверного числа аргументов.
- Выявление вероятно неопределённых переменных, неизвестных magic-методов и свойств классов с __call и __get.
- Выявление неизвестных методов во всех выражениях, не ограничиваясь вызовом через $this. Проверка PHPDocs.
- Проверка возвращаемых типов и назначения типов свойствам.
- Базовое выявление "мёртвого" (никогда не вызываемого) кода. Выявление вызовов instanceof всегда возвращающих значение false, никогда не срабатывающих блоков "else" и кода, находящегося после return.
- Проверка типов аргументов, передаваемых в методы и функции.
- Предупреждение об отсутствии аннотаций с информацией о типах.
- Предупреждение о некорректных union-типах, определяющих коллекции из двух и более типов.
- Предупреждение о вызове методов и доступе к свойствам с типами "nullable".
- Проверка использования типа "mixed".
- Существование классов, используемых в instanceof, catch, typehints и других языковых конструкциях.
- Существование и доступность вызываемых методов и функций, а также числа передаваемых аргументов.
- Проверка возвращения методом данных с тем же типом, что определён в выражении return.
- Существование и видимость свойств, к которым выполняется обращение, а также проверка объявленных и фактических типов данных, используемых в свойствах.
- Корректность числа параметров, переданных в вызовы sprintf/printf в блоке форматирования строк.
- Существование переменных с учётом блоков, формируемых операторами ветвления и циклами.
- Бесполезные приведения типов (например, "(string) ‘foo’") и строгие проверки ("===" и "!==") данных с разными типами и операндами, всегда возвращающими значение false.
- Реализован уровень проверки "9", осуществляющий проверки использования типа "mixed", предназначенного для организации приёма функцией параметров с разными типами. Девятый уровень выявляет небезопасные приёмы использования "mixed", такие как передача значений с типом "mixed" другому типу, вызов методов с типом "mixed" и обращение к его свойствам, так как они могут не существовать.
- Управление проверкой идентичности возвращаемых значений для одинаковых вызовов функций с использованием аннотаций @phpstan-pure и @phpstan-impure.
- Анализ типов в конструкциях try-catch-finally с использованием аннотаций @throws.
- Выявление определённых, но неиспользуемых внутренних (private) свойств, методов и констант.
- Передача несовместимых callback-вызовов в функции работы с массивами, такие как array_map и usort.
- Инспектирование типов для отсутствующих typehint-аннотаций.
- Обеспечена совместимость описаний типов с PHPDocs, что позволяет использовать в PHPDocs типы из сообщений об ошибках.