PHPStan: Un outil qui vous veut du bien

Découverte de paquets
Publié par William

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 :

composer require --dev phpstan/phpstan

Et on lance notre première analyse comme suit :

vendor/bin/phpstan analyse src

Dont le résultat est :

Untitled

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 :

namespace LaravelFrance\PhpstanExample;

class Hello
{
    public function say(string $name): bool
    {
        return "$name say Hello to the world";
    }
}

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:

vendor/bin/phpstan analyse src --level 3

Untitled

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 :

namespace LaravelFrance\PhpstanExample;

class Hello
{
    public function say(string $name): string
    {
        if (is_string($name)) {
            return "$name say Hello to the world";
        }

        return "name is not a string";
    }
} 

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 :

vendor/bin/phpstan analyse src --level 4

Untitled

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.