PHPStan 2.3.0 wurde am 6. Oktober von phpstan-bot veröffentlicht. Das Release behebt 75 Probleme. Die Maintainer melden einen deutlichen Geschwindigkeitsgewinn: Die Analyse des WordPress-Kerns dauerte mit PHPStan 2.1.33 (Dezember 2025) noch 60 Sekunden und benötigt mit 2.3.0 weniger als 8 Sekunden.

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

PHPStan Turbo deckt nun den größten Teil der Analyse-Engine ab. Die Erweiterung liefert gegenüber der Variante ohne Turbo 60 Prozent mehr Geschwindigkeit. Außerdem werden kleinere Turbo-Binaries erzeugt. Traversierung und Arena-Verarbeitung sind gehärtet, identisch erzeugte Binaries werden wiederverwendet, und Analysen mit warmem Ergebnis-Cache laufen schneller.

Die Bleeding-Edge-Analyse erweitert die Inferenz für Generics. PHPStan verzichtet auf die bisherige Verallgemeinerung skalarer Typen und kann new Foo() aus seiner Verwendung über mehrere Durchläufe ableiten. Die bidirektionale Typverengung wird dadurch erweitert. Das Tool erkennt ungenutzte Variablen sowie Schreibzugriffe, deren Werte nie gelesen werden, auch bei Array-Offsets. Closure-Signaturen lassen sich aus den Zielstellen ihrer Werte ableiten. Effekte von Referenzen werden am Aufruf berücksichtigt, und statische Variablen erhalten ihren Typ aus dem Funktionskörper.

Weitere Analyseänderungen betreffen eine einstufige, von innen nach außen arbeitende Überarbeitung der Internals, @pure-unless-parameter-passed, Trennzeichen in preg_quote bei Array-Mustern und PHPDoc-Typen für static::FOO_* sowie T::FOO_*, sobald die Klasse bekannt ist.

Die Fehlerkorrekturen verbessern Scope- und Kontrollflussanalyse. Property-Zugriffe bleiben am Empfänger erhalten, wenn eine statische Methode oder statische Closure ihn ungültig macht. Bedingte Guard-Typen werden aus den Unterschieden von Zweigen abgeleitet. Bei Schleifen entstehen Rückkanten auch aus continue-Anweisungen, wenn das Schleifenende unerreichbar ist. Das Widening berücksichtigt die Variablen, die eine Schleife tatsächlich schreiben kann. Closure-Parameter in Array-Argumenten und generische Parameter aus dem Gerüst eines Array-Literals werden früher inferiert. Bedingungsausdrücke überstehen mehr Scope-Zusammenführungen, und isset() verengt optionale Array-Offsets.

PHPStan liest PHP_SBINDIR und PHP_BUILD_PROVIDER nicht mehr aus der analysierten Maschine. Scope::getPhpVersion() berücksichtigt nun die composer.json-Vorgabe require.php und steuert Prüfungen für typisierte Klassenkonstanten, verfügbare PHP-Funktionen, Properties, Trait-Konstanten, Arrow Functions, printf-Formate, veraltete Casts und Erweiterungstypen. Eine frühzeitig abbrechende Nullsafe-Kette löst keine @phpstan-assert-Anweisungen, bedingten Rückgabetypen oder Call Effects aus. Weitere Korrekturen betreffen Float-Casts außerhalb des Integerbereichs oder mit NAN, callable-ähnliche Werte, die Verengung von ??, never, Array-Unionen, Template-Grenzen, unreine Aufrufe, Variadic-Referenzparameter, private Trait-Methoden und veraltete phpredis-Signaturen.

Für mehr Leistung optimiert das Release konstante Array-Offsets, die Entfernung von Enum-Fällen, die Zählung endlicher Typen, große Unions, das Widening von Shape-Schleifen, Reflection-Namensabfragen, TypeCombinatorCache, Datei-Cache, Typ-Memoisierung, Expression-Keys, Namespace-Uses, unveränderte Dateiinhalte, Closure- und Static-Variable-Inferenz sowie Abhängigkeitsergebnisse. TypeTraverser::mapMemoized() kommt hinzu. Funktionen innerhalb von Funktionen werden nicht mehr exportiert, und ConstantArrayType->checkOurKeys() vermeidet doppelte Arbeit.

Die Signaturen deklarieren gegenseitig ausschließende Konstantengruppen für json_encode, json_decode, filter_var, filter_input, openlog und ZipArchive::open. Übergroße Array-Typen erhalten eine präzisere Verallgemeinerung ihrer Schlüssel und Werte. Intern wandern Ergebnis-Cache-Abhängigkeiten in die Scopes, ResultCacheMetaExtension wird als veraltet markiert, OpenSslCipherMethodsProvider wird verbessert, NodeScopeResolver wird aufgeteilt, und Regeln können mehrere Node-Typen beobachten. Zu den Beitragenden gehören staabm, zonuexe, rubas, arpitjain099, calebdw, Jean-Beru, VincentLanglet und SanderMuller.