PHPStan: Un outil qui vous veut du bien
Découverte d’un outil qui analyse finement notre code afin d’y détecter des bugs !
Présentation
PHPStan est ou outil d’analyse statique, mais qu’est ce que l’analyse statique ?
L'outil parcous notre code et va vérifier des points clés dont notamment :
- La cohérence du typage
- La cohérence des conditions
- La présence de code dupliquer
Tout ça en dehors de tout contexte, d’où la présence de statique dans son nom.
Ce qui veut dire qu’un outil d’analyse statique ne sait pas résoudre les cas comme le passage dans les méthodes magiques de PHP tel que __get
et __set
car celles-ci dépendent d’un contexte.
Premiers pas avec l’outil
On va partir sur un projet basique crée pour l’exercice : PHPStan Example.
On y retrouve une classe Hello
qui contient une méthode say
.
On commence par installer le paquet PHPStan :
1composer require --dev phpstan/phpstan
Et on lance notre première analyse comme suit :
1vendor/bin/phpstan analyse src
Dont le résultat est :
Aucune surprise, notre code est fonctionnel !
A noter quand même la mention de l’option --level
qui permet une analyse plus drastique de notre code dont voici la documentation.
Introduction d’un bug
On va introduire une erreur de typage, dont voici la base de code, pour découvrir comment PHPStan va réagir :
1namespace LaravelFrance\PhpstanExample;2 3class Hello4{5 public function say(string $name): bool6 {7 return "$name say Hello to the world";8 }9}
L’erreur est assez flagrante, on type le retour en bool
.
On relance l’analyse avec le niveau 3 qui permet la vérification du typage:
1vendor/bin/phpstan analyse src --level 3
Et voici notre belle erreur de typage révélée au grand jour !
L’outil nous dit, que dans la méthode Hello::say()
à la ligne 9, on s’attend à retourner un bool
or qu’on retourne systématiquement une string.
Introduction d’un problème de conception
Maintenant, un cas de figure assez classique, qui se produit notamment lors de la refacto lorsque la base de code est trop complexe pour être détecter par un humain :
1namespace LaravelFrance\PhpstanExample; 2 3class Hello 4{ 5 public function say(string $name): string 6 { 7 if (is_string($name)) { 8 return "$name say Hello to the world"; 9 }10 11 return "name is not a string";12 }13}
Ici, on constate aisément qu’on passera dans tous les cas dans le if
et que le second return
ne sera jamais appelé, voyons comment PHPStan nous le dit avec une analyse de niveau 4 :
1vendor/bin/phpstan analyse src --level 4
Et voilà le résultat, PHPStan indique qu’on ne passera jamais à la ligne 13 car on sortira systématiquement par le if
, le code restant est donc inutile.
C’est à dire qu’il à réussi à déduire que le if
, qui test que $name
est une string, le sera toujours dû au fait que l’on applique un typage fort sur ce dernier dans la déclaration de la méthode.
On peut se dire que c’est assez flagrant mais imaginons maintenant que notre if
est enfoui dans une méthode lointaine qui passent à travers d’autres tests dont les résultat sont tout autant prévisible et là notre cerveau d’humain ne fait pas l’affaire ... mais pour PHPStan c’est facile !
Voilà pour 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.
Source : https://github.com/laravel-fr/support-phpstan
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
php-arguments-detector
Les arguments peuvent s'avérer problématique pour la complexité de vos méthodes, ce package vous aidera à garder le contrôle.
Mathieu De Gracia
Des mocks avec Prophecy
Prophecy est un package permettant de créer des puissants et flexibles mock dans vos tests.
Mathieu De Gracia