Statická analýza PHP kodu

(publikováno 25.02.2020) 2 PHP, Kvalita kódu

Díky statické analýze je možné vyhledávat a reportovat chyby bez spuštění kódu. Nástroje proto dokážou odhalit nepříjemné bugy, překlepy, volání neexistujících tříd a funkcí a mnoho dalšího.

Statická analýza PHP kodu

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 StanPhan 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í:

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.