Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Découverte de paquets

PHPStan : Un outil qui vous veut du bien

William Suppo avatar
Publié le 25 avril 2022
Mis à jour le 28 novembre 2024
Couverture de l'article PHPStan : Un outil qui vous veut du bien

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 :

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 :

Untitled

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

Untitled

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

Untitled

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