Statische Codeanalyse: PHPStan erreicht Version 1.0

Das Open-Source-Tool für die statische Codeanalyse von PHP liegt nach sechsjähriger Entwicklungszeit als stabiles und produktionsreifes Major Release vor.

In Pocket speichern vorlesen Druckansicht 16 Kommentare lesen

(Bild: https://phpstan.org/)

Lesezeit: 2 Min.

Ab sofort steht das für die statische Codeanalyse von PHP ausgelegte Open-Source-Werkzeug PHPStan in Version 1.0 vor. PHPStan-Entwickler Ondřej Mirtes hatte vor gut sechs Jahren mit den Arbeiten am Codeanalyse-Tool begonnen, um PHP-Entwicklerinnen und -Entwicklern eine Möglichkeit zu verschaffen, ihren Programmcode bereits vor der ersten Ausführung auf etwaige Fehler zu testen. Seither habe PHPStan laut Blogeintrag auf der Projekt-Webseite einen Reifegrad erreicht, der nun ein stabiles Major Release für den produktiven Einsatz rechtfertige.

Die aktuelle Version hat aber auch neue Funktionen an Bord, darunter den Level-9-Modus und eine präzisere Try-Catch-Finally-Analyse. Der neue Modus soll der grundsätzlichen Einschätzung Rechnung tragen, dass der Einsatz von mixed im Code nicht sicher ist und daher Maßnahmen erfordert. Level 9 verhindert dazu die Weitergabe von mixed. Ist der Modus aktiv, lässt sich dieser Typ weder an einen anderen Typ übergeben, noch lassen sich Methoden damit aufrufen oder auf die Eigenschaften zugreifen.

Bisherigen Versionen von PHPStan mangelte es an Präzision bei der Typinferenz in Try-Catch-Finally-Blöcken. Das Release 1.0 verspricht laut Herausgebern in dieser Hinsicht eine deutliche Verbesserung. PHPStan hat nun eine genauere Vorstellung von den throw-Punkten in try-Blöcken und nutzt sie, um die Typinferenz-Engine über mögliche Typen in catch- und finally-Blöcken zu informieren. Je mehr @throws-Anmerkungen Entwicklerinnen und Entwickler ihren Funktionen und Methoden hinzufügen, um so präziser soll die Analyse werden.

/** @throws \InvalidArgumentException */
function doBar(): int
{
    // ...
}

/** @throws \RuntimeException */
function doBaz(): string
{
    // ...
}

try {
    // $foo is surely defined in all catch blocks
    // because the literal 1 doesn't throw anything
    $foo = 1;

    $bar = doBar(); // might throw InvalidArgumentException
    $baz = doBaz(); // might throw RuntimeException
} catch (\InvalidArgumentException $e) {
    // $foo is always defined
    // $bar is never defined
    // $baz is never defined
} catch (\RuntimeException $e) {
    // $foo is always defined
    // $bar is always defined
    // $baz is never defined
}

Einen Überblick weiterer Neuerungen in PHPStan 1.0 bietet der Ankündigungsblog von Ondřej Mirtes. Eine komplette Liste sämtlicher Bugfixes und Verbesserungen findet sich in den Release Notes auf GitHub. Im Hinblick auf die künftige Weiterentwicklung des Tools zur statischen Codeanalyse stellt Mirtes vor allem die Anpassung an die neueste PHP-Version 8.1 in Aussicht.

(map)