NCA Social Media
Erstellt:
Aktualisiert:
Autor:
Roland Golla
PHPStan

Was ist PHPStan?

PHPStan ist ein Open Source Tool zur statischen Code Analyse für PHP. Es findet Fehler im Code, ohne ihn auszuführen, und prüft Typen, Methodenaufrufe und tote Zweige in Stufen von Level 0 bis Level 10.

Seit Version 2.3 ist PHPStan bis zu 7,5 mal schneller als noch zehn Monate zuvor. Neu sind außerdem die Erkennung ungenutzter Variablen, genauere Generics und Typen für Closures ohne PHPDoc. Entwickelt wird PHPStan von Ondřej Mirtes, der Quellcode liegt offen auf GitHub.

Inhalt

PHPStan mit NCA: Schnelle Hilfe vom Experten

Bei NCA läuft PHPStan in jedem PHP Projekt mit, zusammen mit PHPUnit, Psalm und Rector. Wir nutzen es täglich in Symfony und Sulu Projekten, als Quality Gate in GitHub Actions und GitLab CI. Roland Golla arbeitet seit über 20 Jahren mit Testing und Refactoring. Er kennt den Moment, wenn ein Legacy Projekt zum ersten Mal auf Level 5 läuft und tausend Fehler meldet.

Wenn ihr PHPStan einführen oder auf 2.3 heben wollt, passt das zu unserem PHP Refactoring und zum PHP Update. Für alte Codebasen gibt es die Legacy Modernisierung für PHP und Symfony, für den Build unsere CI CD Pipeline mit Docker und Staging. Wer Coding Agents im PHP Code einsetzt, findet in den NCA PHP AI Coding Guidelines die passenden Regeln.

PHPStan Setup besprechen
Finde das passende Angebot für dein Projekt
Anfrage-Konfiguration
Starten Sie Ihre Anfrage
Projektart
Infos
Nachricht

Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.

CORE EXPERTISE

Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.

BFSG COMPLIANT

Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.

ENTERPRISE READY

PHPStan 2.3: Bis zu 7,5 mal schneller

Die größte Nachricht in PHPStan 2.3 ist das Tempo. Der Maintainer misst auf einem MacBook Pro mit M1 Pro die Analyse des WordPress Quellcodes. Vor den Optimierungen dauerte sie 60,5 Sekunden. Mit Version 2.3.0 sind es 7,9 Sekunden.

PHPStan Turbo

Den größten Anteil hat PHPStan Turbo. Die Extension baut heiße Teile des Analysers in C++ nach. Sie startet Worker per Fork statt als neue Prozesse und hängt einen OPcache Optimizer Pass ein, der interne Typprüfungen entfernt. Mit Turbo ist PHPStan heute fast 60 Prozent schneller als ohne.

Installieren müsst ihr dafür nichts. Die .so und .dll Dateien liegen im Composer Paket phpstan/phpstan. PHPStan wählt die passende Datei für eure PHP Version und startet sich selbst mit der Extension neu. Wer PHPStan per Composer nutzt, hat Turbo meist schon automatisch an.

Die Tabelle zeigt die Messwerte aus dem offiziellen Release Artikel.

PHPStan Analysezeit für WordPress

Version Ohne Turbo Mit Turbo
2.1.33 (vor den Optimierungen) 60,5 Sekunden noch nicht verfügbar
2.2.6 (erste Turbo Version) 32,0 Sekunden 24,7 Sekunden
2.2.13 (OPcache Pass) 23,1 Sekunden 14,1 Sekunden
2.3.0 19,5 Sekunden 7,9 Sekunden

Result Cache: Sekunden statt Minuten im Alltag

Volle Läufe sind nur die halbe Wahrheit. Im Alltag analysiert PHPStan nur geänderte Dateien und ihre Abhängigkeiten. Den Rest liefert der Result Cache. Gemessen am deutlich größeren Drupal sieht das so aus:

  • Keine Änderung: 1,6 Sekunden
  • 10 geänderte Dateien: 2,8 Sekunden
  • 10 Prozent des Projekts: 6,2 Sekunden
  • Voller Lauf: 22 Sekunden

Wichtiger für Teams: Ein Composer Update oder eine Änderung am Symfony DI Container wirft den Cache nicht mehr komplett weg. PHPStan verfolgt jetzt, welche Dateien von welchen Paketen abhängen. Nur ein PHPStan Update oder eine neue Konfiguration startet die Analyse von vorn.

Monorepos mit Composer path Repositories und Setups mit scanDirectories oder scanFiles laufen ebenfalls sauber. Eigene Extensions beschreiben über neue APIs genau, welche Dateien sie ungültig machen. Legt den Cache Ordner fest und speichert ihn in der Pipeline zwischen:

Code:
          

parameters:
    tmpDir: var/cache/phpstan

Generics, Closures und static Variablen

PHPStan kann Generics seit Jahren. Eine Frage war aber nie sauber gelöst: Welchen Typ hat new Collection([1, 2, 3])? Bisher hat PHPStan Skalare verallgemeinert, aus 1 wurde int. Das hat viele präzise Prüfungen verhindert.

Bidirectional Type Narrowing

PHPStan 2.3 analysiert den Code rund um new Collection(...) mehrfach. Es schaut, wie das Objekt genutzt und wohin es übergeben wird. Daraus leitet es den Template Typ ab. Skalare bleiben präzise: 1 bleibt 1. Erwartet eine Funktion Collection<positive-int>, meldet PHPStan jetzt das Hinzufügen von -1:

Code:
          

$ids = new Collection([1, 2, 3]);
$ids->add(4);
$ids->add(-1); // PHPStan 2.3: erwartet positive Zahl, -1 gegeben
saveIds($ids);

Die Änderung schließt 17 offene Issues und kostet nur 1 bis 3 Prozent Laufzeit. Beauftragt und finanziert hat die Arbeit der Sovereign Tech Fund.

Closures und static Variablen ohne PHPDoc

Dieselbe Engine leitet Typen für Closures aus ihrer Verwendung ab. Ihr braucht keine @param oder @return Angaben mehr, auch nicht für Variablen per Referenz. static Variablen bekommen ihren Typ aus allen Zuweisungen in der Funktion statt mixed.

Unused Variables: Neue Regeln gegen vergessene Werte

Ungenutzte Variablen sind oft echte Bugs. Jemand berechnet eine Cache Dauer und vergisst, sie zu übergeben. PHPStan 2.3 findet solche Stellen mit fünf Kernregeln:

  • variable.unused: Die Variable wird zugewiesen, aber nie gelesen.
  • assign.unused: Der Wert wird bis zum Ende der Funktion nicht mehr gelesen.
  • assign.overwritten: Der Wert wird überschrieben, bevor ihn jemand liest.
  • assign.redundant: Die Variable bekommt den Wert, den sie schon hat.
  • assign.unusedFlow: Der Wert fließt nur in Werte, die nie genutzt werden. Die Idee stammt aus dem Data Flow Graph von Psalm.
Code:
          

function cacheReport(Cache $cache, Report $report): void
{
    $ttl = 3600;
    $cache->save($report->getId(), $report);
}
// variable.unused: Variable $ttl is never read.

Dazu kommen Prüfungen für nie gelesene Array Offsets, foreach Keys und Values, Ergebnisse von ++ und --, catch Variablen, ungenutzte use Variablen in Closures und ungenutzte Parameter von Funktionen und privaten Methoden. Für ungenutzten öffentlichen Code bleibt Unused Public die passende Ergänzung.

Neue Engine, Bleeding Edge und Extensions

Möglich wurden die Features durch einen Umbau im Kern. Bis 2.2 liefen drei große Klassen getrennt über den Abstract Syntax Tree. Version 2.3 ersetzt das durch einen einzigen Durchlauf von innen nach außen. Ein Ausdruck liefert jetzt Scope, Typ und Narrowing in einem Ergebnis.

Das merkt ihr bei Code wie $a = [$b = 1, $b + 1]. PHPStan 2.2 kannte den Typ des zweiten Elements nicht genau. PHPStan 2.3 erkennt array{1, 2}.

Die Extension APIs bleiben kompatibel. Für Unused Variables, die neuen Generics und die Closure Typen braucht ihr aber Bleeding Edge in der phpstan.neon:

Code:
          

includes:
    - vendor/phpstan/phpstan/conf/bleedingEdge.neon

Extensions mit aktualisieren

Zeitgleich sind phpstan-strict-rules, phpstan-symfony und phpstan-phpunit in Version 2.1.0 erschienen. phpstan-symfony nutzt die neuen Cache APIs und analysiert bei Container Änderungen nur noch betroffene Dateien. Für Symfony Projekte ist das der größte Gewinn im Alltag. Laravel Teams greifen zu Larastan.

Code:
          

composer update phpstan/phpstan phpstan/phpstan-symfony phpstan/phpstan-phpunit phpstan/phpstan-strict-rules --with-all-dependencies

PHPStan Versionen von 2.0 bis 2.3

PHPStan 2 hat sich in kurzer Zeit stark verändert. Die wichtigsten Schritte im Überblick:

  • PHPStan 2.0: neues Level 10 gegen implizites mixed, ein eigener list Typ und deutlich weniger Speicherverbrauch.
  • PHPStan 2.1: volle Unterstützung für PHP 8.4 mit Property Hooks, Asymmetric Visibility und dem #[Deprecated] Attribut. Ab 2.1.17 kam der Editor Mode für PhpStorm und VS Code dazu.
  • PHPStan 2.2: Unsealed Array Shapes, sicherere Array Keys und die erste Version von PHPStan Turbo.
  • PHPStan 2.3: bis zu 7,5 mal schneller, präziserer Result Cache, Unused Variables, bidirektionale Generics und eine neue Analyse Engine.

Wer noch auf PHPStan 1 steht, hebt zuerst auf 2.0 und erzeugt die Baseline neu. Für einen schnellen ersten Blick auf ältere Projekte eignet sich PHPStan Bodyscan.

Installation und Einsatz in der Pipeline

PHPStan installiert ihr als Dev Abhängigkeit über Composer und startet die Analyse mit einem Befehl. Mit dem dritten Befehl sammelt ihr alle bestehenden Fehler in einer Baseline:

Code:
          

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src --level 5
vendor/bin/phpstan analyse --generate-baseline

Bewährt hat sich diese Reihenfolge:

  1. Mit einem Level starten, auf dem das Projekt fast fehlerfrei ist.
  2. Alte Fehler in der Baseline sammeln, damit neue Fehler sofort auffallen.
  3. PHPStan als Quality Gate in GitHub Actions oder GitLab CI laufen lassen.
  4. Den Result Cache in der Pipeline zwischenspeichern.
  5. Das Level Schritt für Schritt anheben, bis Level 10 erreicht ist.

In der Pipeline läuft PHPStan bei uns zusammen mit PHPUnit und Rector PHP. Lokal hilft GrumPHP, damit Fehler gar nicht erst im Commit landen. Wie weit eure Typen schon sind, zeigt Type Coverage.

PHPStan today is up to 7.5× faster than PHPStan as of ten months ago!

Ondřej Mirtes, Entwickler und Maintainer von PHPStan – PHPStan Blog

NCA Erfahrung mit PHPStan und statischer Analyse

Statische Analyse ist für uns der erste Schritt in jedem Refactoring. Bevor Code umgebaut wird, stehen eine Baseline und ein Quality Gate in der Pipeline. Erst dann räumen wir auf, manuell und mit KI Unterstützung. Warum diese Reihenfolge zählt, steht im Blog unter KI Refactoring zerstört die Applikation und Quality Gates in der Pipeline. Wie ihr das Upgrade konkret angeht, zeigt unsere Anleitung PHPStan 2.3 Update in fünf Schritten.

Gerade bei KI generiertem Code ist PHPStan unverzichtbar. Agents schreiben schnell, aber nicht immer typsicher. Die neuen Unused Variable Regeln finden genau die halbfertigen Zuweisungen, die dabei entstehen. Passende Werkzeuge im NCA PHP Glossar: Psalm für Taint Analysis, Deptrac für Architekturgrenzen und PHP-Parser als Fundament von PHPStan und Rector. Alle Beratungsthemen findet ihr unter PHP Consulting.

CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.
Erreichen Sie unsere PHP Consultant Spezialisten

Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.

Häufige Fragen zu PHPStan

Die wichtigsten Fragen zu PHPStan 2.3, Turbo, Result Cache und dem Einsatz in PHP Projekten.

Was ist neu in PHPStan 2.3 im Jahr 2026?

PHPStan 2.3 bringt vor allem Tempo. Mit Turbo analysiert es den WordPress Quellcode in 7,9 statt früher 60,5 Sekunden. Dazu kommen ein präziserer Result Cache, fünf Regeln für ungenutzte Variablen, Generics ohne Verallgemeinerung von Skalaren, Typen für Closures ohne PHPDoc und eine neu geschriebene Analyse Engine. Die meisten neuen Prüfungen brauchen Bleeding Edge.

Wie schnell ist PHPStan 2026 im Vergleich zu früher?

Bis zu 7,5 mal schneller als zehn Monate zuvor. Gemessen auf einem MacBook Pro mit M1 Pro brauchte WordPress mit Version 2.1.33 noch 60,5 Sekunden. Mit 2.3.0 und Turbo sind es 7,9 Sekunden, ohne Turbo 19,5 Sekunden. Mit warmem Result Cache dauern Läufe im Alltag oft nur wenige Sekunden.

Was ist PHPStan Turbo 2026 und muss ich es installieren?

PHPStan Turbo ist eine optionale Extension, die heiße Teile des Analysers in C++ ausführt. Sie forkt Worker statt neue Prozesse zu starten und entfernt per OPcache interne Typprüfungen. Installieren müsst ihr nichts: Die .so und .dll Dateien liegen im Composer Paket, PHPStan wählt die passende Datei und startet sich selbst damit neu.

Welche ungenutzten Variablen erkennt PHPStan 2026?

Es gibt fünf Kernregeln: variable.unused für nie gelesene Variablen, assign.unused für Werte ohne späteren Lesezugriff, assign.overwritten für überschriebene Werte, assign.redundant für Zuweisungen mit gleichem Wert und assign.unusedFlow für Werte, die ins Leere fließen. Dazu kommen Array Offsets, foreach Keys und Values, catch Variablen, Closure use Variablen und ungenutzte Parameter.

Brauche ich 2026 Bleeding Edge für die neuen PHPStan Features?

Ja, für die meisten. Unused Variables, die neuen Generics und die Closure Typen laufen nur mit Bleeding Edge. Dafür bindet ihr die Datei bleedingEdge.neon aus dem PHPStan Paket in eure phpstan.neon ein. Die Performance Verbesserungen und der bessere Result Cache wirken dagegen sofort nach dem Update, ohne weitere Konfiguration.

Wie funktioniert der Result Cache von PHPStan?

PHPStan merkt sich, welche Fehler es in welchen Dateien gefunden hat. Beim nächsten Lauf analysiert es nur geänderte Dateien und deren Abhängigkeiten. Seit 2.3 verwerfen Composer Updates und Änderungen am Symfony Container den Cache nicht mehr komplett. Ganz neu analysiert wird nur nach einem PHPStan Update oder einer geänderten Konfiguration.

Wie nutze ich den Result Cache in der CI Pipeline?

Legt mit tmpDir einen festen Ordner für den Cache fest und speichert ihn zwischen den Läufen. In GitHub Actions geht das mit actions/cache, in GitLab CI mit dem cache Schlüssel. So profitieren auch Pipelines von kurzen Laufzeiten. Ohne gespeicherten Cache startet jede Pipeline mit einem vollen Durchlauf.

Was ist der Unterschied zwischen PHPStan und Psalm?

Beide prüfen PHP Code statisch. PHPStan hat das größere Extension Ökosystem und mit Turbo inzwischen einen klaren Tempovorteil. Psalm ist stark bei Taint Analysis für Sicherheitsthemen. Die neue Unused Variable Erkennung in PHPStan orientiert sich sogar am Data Flow Ansatz von Psalm. Viele Teams setzen beide Tools ein, wir auch.

Welches PHPStan Level sollte ich wählen?

Startet mit einem Level, auf dem euer Projekt fast fehlerfrei ist, und hebt es Schritt für Schritt an. Alte Fehler sammelt ihr in einer Baseline, damit neue sofort auffallen. Neue Projekte können direkt hoch einsteigen. Level 10 verbietet implizites mixed und ist das Ziel für sauber typisierten Code.

Funktioniert PHPStan mit Symfony und Laravel?

Ja. Für Symfony gibt es phpstan-symfony, das seit Version 2.1.0 bei Container Änderungen nur betroffene Dateien neu analysiert. Für Laravel ist Larastan die Standard Extension. Dazu kommen offizielle Extensions für PHPUnit und strenge Regeln mit phpstan-strict-rules. Nach einem Update auf 2.3 solltet ihr die Extensions gleich mit aktualisieren.

Hilft PHPStan bei KI generiertem Code?

Ja, sehr. Coding Agents schreiben schnell, übersehen aber Typen und lassen halbe Zuweisungen stehen. PHPStan prüft jede Änderung, bevor sie gemergt wird, egal ob ein Mensch oder ein Agent sie geschrieben hat. Mit Baseline und Quality Gate in der Pipeline durchläuft jeder Vorschlag dieselbe strenge Prüfung.

Wer entwickelt PHPStan und wie wird es finanziert?

PHPStan wird von Ondřej Mirtes entwickelt und ist Open Source. Finanziert wird es über GitHub Sponsors und das Abo PHPStan Pro. Die Arbeit an der bidirektionalen Typableitung für Generics hat der Sovereign Tech Fund beauftragt und bezahlt. Wer PHPStan täglich nutzt, kann das Projekt über die Sponsor Seite unterstützen.

Bildergalerie PHPStan

Willkommen in unserer Bildergalerie rund um PHPStan, das leistungsstarke Tool zur statischen Analyse von PHP-Code. Von detaillierten Fehlermeldungen über praktische PHPDocs bis hin zu spannenden Updates wie PHPStan 2.0 – hier finden Sie alles, was Sie über dieses unverzichtbare Tool wissen müssen. Lassen Sie sich inspirieren und bringen Sie Ihre Codequalität auf das nächste Level!

Ein Screenshot einer PHPStan-Ausgabe im Terminal. Zu sehen ist eine Fehlermeldung, die darauf hinweist, dass eine Methode nicht definiert ist und eine Bedingung immer wahr ist.

Ein festliches Banner mit Luftballons, Konfetti und Wimpeln zur Ankündigung von PHPStan 2.0.

Vorder- und Rückseite eines blauen T-Shirts mit dem PHPStan-Logo (einem Elefanten mit Lupe) auf der Vorderseite und dem Schriftzug „PHPStan“ auf der Rückseite.

Ein Screenshot von PHPStan Pro, das eine detaillierte Codeanalyse zeigt. Zu sehen sind Fehler und Hinweise, die auf potenzielle Verbesserungen im Code hinweisen.

Zwei blaue Plüschelefanten, einer mit dem PHPStan-Logo und der andere mit dem PHP-Logo. Diese Elefanten repräsentieren die Maskottchen der PHP-Community und Tools.

Ein dunkler Editor-Hintergrund mit PHP-Dokumentationsanweisungen. Zu sehen sind Tags wie @template, @param und @return, die die Nutzung von Generics in PHP zeigen.

Eine GitHub-Ansicht mit dem Titel „phpstan/phpstan“. Es beschreibt PHPStan als statisches Analysetool für PHP, das Fehler im Code ohne Ausführung entdeckt.