Découverte de PHPStan, un outil qui analyse finement notre code afin d’y détecter des bugs !
À propos de PHPStan et de l'analyse statique
PHPStan est ou outil d’analyse statique, dont la promesse est de détecter des bugs avant qu'ils n'arrivent en production !
Mais avant de rentrer dans le vif du sujet, définissons ce qu'est l’analyse statique ?
L'analyse statique est une méthode qui permet d'obtenir des informations sur notre code sans l'exécuter, contrairement à du débogage où on aura en plus du dérouler de l'exécution, la stacktrace, on aura éventuellement les valeurs des variables.
Avec un outil d'analyse statique comme PHPStan, on va plutôt chercher à prévenir que guérir, et via ce genre d'outil, on peut récupérer tout un tas d'informations comme :
- La cohérence du typage
- La pertinence des conditions
- La présence de code dupliqué
Installation et première analyse
Afin de découvrir l'outil sans fioritures, on va partir sur un projet simple. Commençons par créer le dossier discover-phpstan
et une fois à l'intérieur, on installe PHPStan :
1composer require --dev phpstan/phpstan
Ensuite, on va créer le dossier src
qui contiendra notre cobaye la classe Hello
:
1<?php 2 3namespace App; 4 5class Hello 6{ 7 public function say(string $name): string 8 { 9 return "$name say Hello to the world";10 }11}
Nous voilà prêts pour la première analyse de notre projet :
1php vendor/bin/phpstan analyse src
PHPStan a analysé notre classe et nous a livré le rapport suivant :
Aucune surprise, notre code est fonctionnel et ne contient pas d'erreurs !
Allons puis loin en introduisant un bug
Après tout, PHPStan est là pour nous couvrir, on va donc délibérément introduire une erreur de typage en retour de notre méthode say() comme ceci :
1<?php 2 3namespace App; 4 5class Hello 6{ 7 public function say(string $name): bool 8 { 9 return "$name say Hello to the world";10 }11}
L’erreur est assez flagrante, mais pour que PHPStan nous la remonte, il est nécessaire de spécifier le niveau 3 d'analyse.
A noter que plus le niveau est élevé plus l'analyse de notre code va être rigoureuse
On relance donc la commande en spécifiant le niveau :
1php vendor/bin/phpstan analyse src --level 3
Et voici notre belle erreur de typage révélée au grand jour !
L’outil est assez descriptif et nous indique que le retour de la méthode Hello::say()
, à la ligne 9, devrait toujours être une string
, or on a explicitement écrit que le typage de retour de notre méthode est bool
, il y a donc une incohérence qui va provoquer une erreur.
Est-il capable de retourner les problèmes de conception ?
On va maintenant introduire une erreur de conception assez visible pour un humain dans notre code, cela ne cause pas de bug en soit, juste on introduit une portion de code qui ne sera jamais utilisée :
1<?php 2 3namespace App; 4 5class Hello 6{ 7 public function say(string $name): string 8 { 9 if (is_string($name)) {10 return "$name say Hello to the world";11 }12 13 return "name is not a string"; 14 }15}
Ici, on constate aisément qu'on passera jamais dans la ligne 9, la condition ligne 5 vérifiant le type de la variable $name
qui ne peut être que string
étant donné le typage dans la déclaration de la méthode.
Lançons une analyse avec le niveau 4 cette fois-ci :
1php vendor/bin/phpstan analyse src --level 4
C'est là où réside la puissance de l'outil, il est notamment capable de nous remonter du code mort ! Prenons un peu du recul et imaginons que ce code soit perdu au fin fond d'un enchaînement de méthode, eh bien PHPStan est capable de le détecter et de nous en informer !
Nous voilà arrivés à la fin de la découverte de PHPStan, à savoir que l'outil a une configuration très poussée et que de nombreuses contributions existent tel que Larastan.
Il est d'ailleurs possible de produire ses propres règles comme nous l'avons évoqué dans l'article PHPStan valide nos règles de conception
A lire
Autres articles de la même catégorie
Type-Safe de A à Z
Unifiez les types entre le backend et le frontend pour réduire les bugs et améliorer la cohérence de votre code
Rémy Guillermic
Maîtriser vos données avec un DTO !
Analyse du paquet data-transfer-object de Spatie qui permet, à travers une entité, de rendre notre code plus consistant.
William Suppo
Explorez le CQRS avec le package artisansdk
Exploitez le pattern CQRS dans votre application Laravel.
Mathieu De Gracia