Tradiční programovací jazyky jako jsou C/C++, C#, Java ale i nové jako Go, Kotlin či Rust a další. Ty všechny součástí kompilace obsahují statickou analýzu kódu. Jedná se zjištění, jestli jsou používány pouze existující třídy, metody i funkce. Jestli parametry jsou správných typů a mnoho dalšího. Interpretované jazyky jako PHP, Python či JavaScript jsou často dynamicky typované a typovou kontrolu nemají.
Statická analýza ale dokáže odhalit chyby, které by se jinak projevily až při běhu. Proto vznikl TypeScript, který je typový i přesto, že JavaScript je dynamický typovaný. Anebo nástroje jako je PHP Stan a Phan pro PHP. Či Credo pro Elixir, který je kompilovaný ale dynamicky typovaný.
Statická analýza pro PHP
Pro PHP existuje několik nástrojů na statickou analýzu. Podrobnější popis a srovnání je popsáno třeba na Badoo Tech, kteří používají hned 3 nástroje najednou. Všechny ale v podstatě umí:
- Kontrolu syntaxe
- Kontrolu existence tříd (interfaců, traitů atd.), metod a funkcí ale i konstant
- Kontrolu správných typů proměnných ať už na základě type-hintu či PHPDoc bloku
- Detekce "mrtvého" kódu - spíše jen v rámci metody či funkce, nebo nepoužitých proměnných
Osobně používám PHP Stan od Ondřeje Mirtese. Je velmi jednoduchý na použití - stačí nainstalovat a spustit. Pro začátek není ani nutné používat konfigurační soubor. Dokumentaci lze najít přímo na webu https://phpstan.org. Nevýhodou za mě je použití Neon formátu pro konfiguraci, který používá snad jen Nette.
Obsahuje celkem 9 levelů detekce, kdy level 0 obsahuje jen nejzákladnější pravidla, zatímco level 8 je již velmi přísný. Použil jsem jej například v knihovně pro responzivní stránkování, kde díky jednoduchosti jsem dosáhl levelu 8. Na jiných projektech jsem se ale trochu zasekl již na 6.
PHP Stan ani jiné nástroje nekontrolují coding standardy či použití type-hintu vs. PHPDoc bloku a další. Od toho je vhodné používat dohromady s Code Snifferem.
Ukázka konfigurace a spouštění
Následující konfiguraci používám na projektu přihlašovacího systému Sun Outdoor. Ten je napsán v Laravelu a proto i do PHP Stanu jsem si přidal rozšíření Larastan, který podporuje veškerou Laravel magii. Konfigurací je možné některé soubory vynechat či ignorovat jisté chyby. Bohužel chybí kód chyby a je nutné psát regulární výrazy pro samotné chybové hlášky.
Vše se poté spustí příkazem ./vendor/bin/phpstan analyse
# PHP Stan obsahuje oficiální i neoficiální pluginy pro různé frameworky a knihovny.
includes: - ./vendor/nunomaduro/larastan/extension.neon parameters: paths: - app excludes_analyse: - app/Modules/Parsedown # Přetížení knihovny, ignoruji kompletně vše ve složce level: 6 reportUnmatchedIgnoredErrors: true # Ignorované chyby které se již nedějí jsou také chyby # Chyby je možné ignorovat globálně či jen v daných souborech ignoreErrors: - '#isRole(Master|Admin|BusLeader|Instructor|Teacher|Parent|Or)*\(\)#' # Jsou magické metody - message: '#Google_Http_MediaFileUpload#i' # Problem s Google knihovnou path: app/Jobs/BackupDBJob.php
Používáte nástroj pro statickou analýzu v PHP či jiném jazyce? Podělte se v komentářích
K tomuto článku již není možné přidávat další komentáře
Komentáře
Používám phpstan a je to naprostá bomba (právě jsem mnohé odradil - nic neodradí čecha tak spolehlivě, jako nadšení).
Co bych na něm vypíchl:
- poradí si s generikami (takové to, aby pole obsahovalo položky stejného typu, ale ještě nevíme jakého)
- možnost nasadit na už běžící projekt, a postupně přitahovat šrouby
- snadnost nasazení
- výborná dokumentace (v tomto s autorem nesouhasím, ale koukám, že to taky psal v roce 2020, takže možná to bylo horší)
- plus teda, dokáže najít ty chyby no :-)
Díky za komentář :) Ano dokumentace nebyla rozhodně taková, jaká je dnes, článek upravím.
Vše se změnilo, když PHPStan začal s placeným rozšířením, což bylo jen pár měsíců po vydání článku.