Agence web » Actualités du digital » Quoi de neuf dans PHPStan 1.0 ? – CloudSavvy IT

Quoi de neuf dans PHPStan 1.0 ? – CloudSavvy IT

PHPStan a franchi une étape importante début novembre 2021 avec de nouvelles fonctionnalités, des règles supplémentaires et de nombreuses optimisations de performances. Cela signifie que le principal analyseur statique PHP est désormais considéré comme stable et est livré avec une promesse de compatibilité descendante pour les futures mises à jour.

Comme il s’agit d’un problème majeur, PHPStan 1.0 apporte également des changements de rupture qui pourraient affecter vos analyses existantes. Ceux-ci incluent des règles supplémentaires et certains paramètres de configuration remplacés ou supprimés.

Le nouveau niveau 9

PHPStan analyse votre source PHP pour trouver des problèmes potentiels sans réellement exécuter le code. Parallèlement aux tests unitaires et de bout en bout, cela vous donne une visibilité sur la qualité de votre code en faisant apparaître les problèmes avant que les utilisateurs ne les rencontrent.

Les niveaux PHPStan sont utilisés pour configurer la rigueur de l’analyseur. La série de versions v0.x proposait huit niveaux, 0 le plus détendu et 8 le plus strict. Bien qu’il soit préférable d’utiliser le niveau le plus strict possible pour la meilleure couverture, des niveaux moins stricts peuvent vous aider à introduire PHPStan dans une base de code imparfaite.

PHPStan 1.0 ajoute le niveau 9 comme nouvelle option. Il comprend toutes les règles à partir du niveau 8 et inférieur, ainsi qu’un contrôle supplémentaire : strict mixed comparaisons de types.

Les mixed type est arrivé dans PHP 8.0 comme un moyen de taper explicitement « n’importe quelle » valeur. Comme mixed est essentiellement équivalent à une valeur non typée, il est dangereux de faire des hypothèses sur ce qu’est un mixed-type value ressemble.

Le neuvième niveau de PHPStan appliquera strictement cela en signalant une erreur si vous essayez d’utiliser activement un mixed valeur dans votre code. L’accès à une propriété ou l’appel d’une méthode n’est pas autorisé car vous ne pouvez pas savoir si elles existeront. Vous ne pouvez transmettre des valeurs qu’à travers d’autres mixed-type typehints lorsque cette règle est active.

Pour activer le nouveau comportement, vous devez modifier level: 8 à level: 9 dans ton phpstan.neon fichier de configuration. PHPStan prend également en charge level: max comme alias pour le plus haut niveau. Si vous utilisez déjà max, vous obtiendrez automatiquement le niveau 9 lorsque vous passerez à PHPStan 1.0.

Meilleure prise de conscience dans les blocs Try-Catch-Finally

PHPStan a maintenant une meilleure inférence de type et une meilleure connaissance des variables pour les blocs try-catch-finally. Il utilisera le @throws docblock pour vérifier les types d’exceptions levées par chaque fonction de votre base de code. Cette compréhension est utilisée pour informer les contrôles de disponibilité des variables dans les blocs try-catch.

Voici un exemple démontrant pourquoi cela est important :

/**
 * @throws DemoException
 */
function first() {
    throw DemoException();
}
 
/**
 * @throws OtherException
 */
function second() {
    throw OtherException();
}
 
try {
    $first = first();
    $second = second();
}
catch (DemoException $ex) {
    error_log($second);
}
catch (Exception $ex) {
    error_log("General exception");
}

La première catch accès au blog $second mais cela n’existera pas quand DemoException est capturé. PHPStan v1.0 utilise le @throws déclaration pour réaliser cela afin que vous soyez informé lorsque votre catch les blocs font référence à des variables éventuellement non définies. Fonctionne sans @throws les annotations se comporteront généralement de la même manière qu’auparavant.

À la suite de ce changement, l’option polluteCatchScopeWithTryAssignments paramètre a été supprimé. Cela vous permettait d’accéder aux variables définies dans un try bloquer dans ce qui suit catch; ce n’est plus nécessaire car PHPStan peut maintenant déterminer quelles variables sont disponibles.

Détection de code inutilisé

PHPStan s’est amélioré pour trouver et signaler certaines formes de code inutilisé dans votre projet. Il mettra en évidence les propriétés de classe privée, les méthodes et les constantes qui ne sont jamais appelées ou consultées.

Leur présence est presque toujours involontaire. Si vous souhaitez conserver le code mort plus longtemps, vous pouvez essayer de le commenter ou d’ajouter le @phpstan-ignore-next-line commentaire pour contourner le contrôle.

Améliorations des valeurs mémorisées

La v1.0 améliore la cohérence de la mémoire de PHPStan pour les valeurs de retour des fonctions. Il est plus apte à comprendre quand une fonction est appelée une deuxième fois, offrant une meilleure anticipation des valeurs de retour identiques.

Cela conduit à une meilleure détection de code mort lorsqu’une condition est répétée plusieurs fois. PHPStan avertira lorsqu’un bloc devient redondant car l’exécution est terminée par une branche antérieure avec la même condition :

if ($demo -> isActive()) {
    return;
}
 
if ($demo -> isActive()) {
    recordDemoActivity();
}

Le deuxième bloc ne s’exécutera jamais car le premier se termine toujours. Il y a une hypothèse en jeu cependant : isActive() doit toujours retourner le même valeur tout au long de la durée de vie de $demo. En termes plus concrets, isActive() doit être une fonction pure où des entrées répétées produisent toujours une sortie identique.

PHPStan suppose que les fonctions sont pures par défaut. Dans les cas où ils ne le sont pas, vous pouvez ajouter le @phpstan-impure annotation dans un docblock au-dessus de la définition de la fonction. Cela désactivera la mémoire de la valeur de retour pour cette fonction. Vous devrez l’utiliser dans l’exemple ci-dessus si isActive() pourrait renvoyer une valeur différente à chaque appel, ce qui signifie que la première vérification pourrait équivaloir à false et laissez la deuxième branche s’exécuter.

/** @phpstan-impure */
public function isActive() : bool {
    return (date("Y") === "2021");
}

Autres améliorations de règles

Plusieurs nouvelles règles ont été ajoutées aux niveaux 1 à 6 existants. Celles-ci incluent des vérifications des constantes et des propriétés de substitution, essayant d’étendre un final classe et détection de toujours vrai et toujours faux while conditions de boucle.

Les types sont maintenant vérifiés de manière récursive pour les types manquants. Cela signifie que les définitions PHPDoc comme array<array> ne seront pas acceptés car ils n’ont pas de définition de type interne. Vous devrez également saisir les valeurs attendues des éléments du tableau de deuxième niveau, tels que array<array<string>>.

Outre la vérification du contenu source, PHPStan 1.0 examine la validité globale de .php fichiers aussi. Le niveau 0 vérifie les espaces blancs et la nomenclature des fichiers de début et de fin, en tant que caractères égarés avant ou après le <?php ... ?> La paire de balises peut provoquer une sortie inattendue lors de l’exécution.

Performances et stabilité

Les performances ont été améliorées dans plusieurs domaines en optimisant des opérations spécifiques et en résolvant certaines fuites de mémoire. Ceux-ci devraient contribuer à des analyses plus rapides et plus fiables de bases de code plus importantes.

Comme la v1.0 est considérée comme une version stable formelle, elle est fournie avec l’assurance que les futures versions mineures (1.1, 1.2, 1.3, etc.) seront rétrocompatibles. Bien que le passage de la v0.x à la v1.0 puisse nécessiter quelques ajustements de configuration, vous aurez un chemin de migration plus facile à l’avenir.

Les développeurs d’extensions PHPStan et d’ensembles de règles personnalisés bénéficient également d’une base de code plus stable et moins susceptible de changer. La documentation du développeur a également été étendue, avec une couverture plus accessible de la création de règles personnalisées. Il devrait être plus facile de commencer lors de la mise en œuvre des propres règles de votre équipe dans votre analyse PHPStan.

Bien que cela soit de bon augure pour le support futur, les utilisateurs et les développeurs d’extensions sont confrontés à des changements majeurs lors du passage à la version 1.0. Plusieurs paramètres de configuration de scan ont été renommés ou modifiés, avec bootstrap devenir bootstrapFiles et excludes_analyse remplacé par excludePaths.

En interne, l’API des extensions a été largement révisée, de sorte que de nombreuses classes et méthodes ont été modifiées ou supprimées. La liste complète des modifications rétrocompatibles est disponible dans le journal des modifications v1.0.

Sommaire

PHPStan v1.0 fait mûrir le projet en optimisant les performances, en ajoutant de nouvelles règles et en corrigeant certaines irrégularités de détection. L’évolution de PHPStan au cours des dernières années a contribué au changement plus large de la communauté PHP pour adopter les concepts de langage typé. L’ajout de fonctionnalités telles que les propriétés typées et les types d’union a produit un langage capable de prendre en charge une inspection externe avancée, ainsi qu’une introspection interne détaillée via la réflexion.

La promotion vers une version semi-stable devrait contribuer à encourager l’adoption de PHPStan dans toute la communauté. La migration vers la nouvelle version devrait être assez simple pour les projets modernes qui utilisent déjà un niveau de règle PHPStan strict.

Vous pouvez mettre à niveau vers PHPStan v1.0 aujourd’hui en exécutant composer require phpstan/phpstan dans vos projets. Il est conseillé de lire d’abord les notes de version pour identifier les changements de rupture que vous devez traiter. La présence de règles supplémentaires dans chaque niveau existant peut entraîner l’échec des tests de votre base de code même s’il a réussi avec PHPStan v0.x. Vous pouvez désactiver temporairement les nouvelles règles en les ajoutant à votre référence afin qu’elles soient exclues des résultats de l’analyse.