PHPStan 2.3.0 a été publié par phpstan-bot le 6 octobre. Cette version corrige 75 problèmes. Les mainteneurs annoncent un gain de performance important : l’analyse du cœur de WordPress prenait 60 secondes avec PHPStan 2.1.33, sorti en décembre 2025, et demande moins de 8 secondes avec 2.3.0.
includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neonPHPStan Turbo couvre désormais la majeure partie du moteur d’analyse. L’extension apporte un gain de 60 % par rapport à l’exécution sans Turbo. La version réduit aussi la taille des binaires Turbo, renforce leur parcours et leur gestion de l’arène, réutilise les binaires issus de paramètres de compilation identiques et accélère les analyses avec un cache de résultats déjà chaud.
Le mode Bleeding Edge étend l’inférence des generics. PHPStan supprime la généralisation scalaire et peut déduire new Foo() à partir de ses usages au moyen de plusieurs passes. Cette évolution apporte une inférence bidirectionnelle des types. L’outil détecte les variables inutilisées et les écritures dont la valeur n’atteint jamais une utilisation, y compris pour les offsets de tableaux. Les signatures de closures peuvent être déduites de la destination de leurs valeurs. Les effets des usages par référence sont appliqués au point d’appel, et le type des variables statiques est déduit du corps de la fonction.
D’autres changements concernent une réécriture interne en une seule passe, effectuée de l’intérieur vers l’extérieur, @pure-unless-parameter-passed, les délimiteurs de preg_quote dans les motifs de tableaux et les types PHPDoc static::FOO_* ou T::FOO_* après résolution de la classe.
Les corrections améliorent l’analyse des scopes et du flux de contrôle. Les accès aux propriétés restent attachés au récepteur après l’invalidation provoquée par une méthode statique ou une closure statique. Les types des gardes conditionnelles utilisent les différences entre branches. Les boucles construisent leur retour arrière à partir des instructions continue quand leur fin est inaccessible. L’élargissement du scope suit aussi les variables qu’une boucle peut écrire. Les types des paramètres de closures dans les arguments de tableaux et les paramètres génériques issus de la structure d’un littéral de tableau sont déduits plus tôt. Les porteurs d’expressions conditionnelles survivent à davantage de fusions de scopes, et isset() affine les offsets de tableaux optionnels.
L’analyse ne lit plus PHP_SBINDIR ni PHP_BUILD_PROVIDER sur la machine analysée. Scope::getPhpVersion() respecte désormais la contrainte require.php de composer.json et pilote les contrôles concernant les constantes de classe typées, les fonctions disponibles selon PHP, les propriétés, les constantes de traits, les fonctions fléchées, les formats printf, les casts obsolètes et les types d’extensions. Une chaîne nullsafe qui s’arrête ne déclenche pas @phpstan-assert, les types de retour conditionnels ni les effets d’appel. D’autres corrections concernent les casts de flottants au-delà de la plage des entiers ou avec NAN, les valeurs de type callable, le resserrement de ??, la conservation de never, les unions de tableaux, les limites de templates, les appels impurs, les paramètres variadiques par référence, les méthodes privées de traits et les signatures obsolètes de phpredis.
Les optimisations touchent les offsets de tableaux constants, la suppression de cas d’enums, le comptage des types finis, les grandes unions, l’élargissement des formes dans les boucles, les noms de réflexions, TypeCombinatorCache, le cache de fichiers, la mémorisation des types, les clés d’expressions, les NamespaceUses, le contenu des fichiers inchangés, l’inférence des closures et des variables statiques ainsi que les résultats de dépendances. TypeTraverser::mapMemoized() est ajouté. Les fonctions déclarées dans des fonctions ne sont plus exportées, et ConstantArrayType->checkOurKeys() évite des calculs répétés.
Les signatures déclarent des groupes de constantes mutuellement exclusifs pour json_encode, json_decode, filter_var, filter_input, openlog et ZipArchive::open. Les types de tableaux trop volumineux généralisent mieux leurs clés et leurs valeurs. Les changements internes déplacent les dépendances du cache de résultats vers les scopes, déprécient ResultCacheMetaExtension, améliorent OpenSslCipherMethodsProvider, découpent NodeScopeResolver et permettent à une règle d’écouter plusieurs types de nœuds. Les contributeurs comprennent staabm, zonuexe, rubas, arpitjain099, calebdw, Jean-Beru, VincentLanglet et SanderMuller.




Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
Rien reçu ? Vérifiez le dossier spam — et marquez le message « Non spam » pour qu'il arrive directement la prochaine fois.