Пасля шасці гадоў распрацоўкі адбыўся першы стабільны рэліз статычнага аналізатара 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