PHPStan

Le radar anti-bug

phpstan
Philippe Escalle CTO

Imagine un radar de flic planqué dans ton IDE. Tu roules tranquille en PHP, pensant que tout va bien, et bim : excès de type, propriété inconnue, tableau pas assez typé... PHPStan ne laisse rien passer. Sauf que lui, il ne t’envoie pas une amende, il t’évite des bugs.

Bienvenue dans le monde merveilleux de l'analyse statique pour PHP, où PHPStan joue les vigiles du typage et les détectives de la cohérence avant même que ton code ne tourne.

PHPStan : le TypeScript du pauvre ?

C’est un peu le TypeScript de PHP, sans les classes du langage en dur. Il analyse ton code sans l’exécuter, pour t’éviter des surprises en prod du genre :

  • "Undefined method getTitle()"

  • "Expected string, got null"

  • "Array of mixed ? Vraiment ? Tu veux pas préciser ?"

Il s’installe en un composer require phpstan/phpstan, se configure avec un fichier .neon (non, ce n’est pas un bug, c’est un format), et peut monter en strictesse du niveau 0 à 9. Le niveau 0 c’est "papy fait de la résistance", le niveau 9 c’est "examen du code au microscope électronique".

Le champion de la rigueur (même contre toi)

PHPStan est très fort pour repérer les erreurs classiques :

  • Appels à des méthodes ou propriétés inexistantes

  • Incohérences de type (tu dis que ça retourne un User, mais en fait c’est null ou un tableau, bravo...)

  • Tableaux flous comme des souvenirs d’après-fêtard

Exemple pratique :

// Avant PHPStan
$user->setName($_GET['name']);

// PHPStan va râler si ça peut être null
// Après correction
if (isset($_GET['name'])) {
    $user->setName($_GET['name']);
}
// Autre cas
function greet(): string {
    return 42; // Aïe
}

PHPStan : "Tu m'avais promis une string, pas une réponse à la question sur la vie."

Le mode turbo : extensions et strict rules

T'as un projet legacy avec plus d'erreurs qu'un clavier QWERTY en main de français ? Pas de panique, il y a le baseline. Il note toutes les erreurs existantes, pour que tu ne voies que les nouvelles. Et si tu veux aller au bout de la rigueur (et de la souffrance ?), active les strict rules ou le bleeding edge.

Ces modes là, c’est comme passer le code au détecteur de mauvaise foi :

  • Comparaison lâche (==) ? Non. Trois === ou rien.

  • Propriétés non initialisées ? Aïe.

  • Fonctions pas "pures" ? Il te suspecte d'avoir des effets de bord comme un thé au laxatif.

Et avec Laravel, Symfony & co ?

Pas de panique, PHPStan a des extensions pour les gros frameworks. Laravel, Symfony, Doctrine... il comprend leurs conventions, migrations, services, et même les helpers magiques (à la request()->user()).

Tu peux donc l'utiliser dans des projets modernes sans passer pour un moine copiste des annotations.

Comparaison avec d'autres outils

Il existe d'autres outils d'analyse statique pour PHP comme Psalm (plus strict, orienté sur les types) ou Phan (plus rare mais rapide). PHPStan se distingue par sa communauté active, ses nombreuses extensions, et sa doc très claire. Il est souvent plus facile à intégrer progressivement, surtout avec les niveaux de règles.

Intégration avec les outils de développement

PHPStan s'intègre parfaitement dans un pipeline CI/CD :

  • Ajout dans des workflows GitHub Actions ou GitLab CI pour vérifier chaque pull request

  • Intégration avec des outils comme PHP-CS-Fixer, PHPUnit ou Rector pour un combo qualité/test/refacto

  • Compatible avec des plugins d'IDE pour du feedback instantané (VSCode, PHPStorm...)

C’est l’assurance qualité automatique : les bugs ne passent plus les portes du dépôt sans un contrôle strict.

Bonnes pratiques pour utiliser PHPStan

  • Commencer doucement : niveau 0 ou 1 sur les vieux projets, puis monter petit à petit

  • Activer la baseline pour ne traquer que les nouvelles erreurs

  • Ajouter des PHPDoc pertinents pour guider l’analyse

  • Coupler à des tests unitaires pour une couverture double (statique + dynamique)

  • Ignorer intelligemment : certains faux positifs méritent un @phpstan-ignore-line (avec modération)

Limites de PHPStan

PHPStan n'est pas infaillible. Il peut produire des faux positifs, surtout si ton code utilise beaucoup de magie noire (appels dynamiques, code généré, etc.). Sur un projet legacy, l'analyse peut être décourageante au début. Dans ce cas, pense à utiliser la baseline pour avancer par petits pas.

Et il ne remplace pas les tests : il les complète.

Pour les CTO : rigueur stratégique ou cauchemar bureaucratique ?

PHPStan, c’est un peu comme embaucher un stagiaire pointilleux qui relit chaque ligne de code, mais sans café à préparer. C’est un investissement en qualité, un pare-feu à bugs et un outil de scalabilité mentale.

Côté stratégie, intégrer PHPStan au début d’un projet, c’est gagner du temps et de la fiabilité. Le coupler à du CI, du quality gate, et un peu d’éducation interne sur le typage et les PHPDoc, c’est poser des fondations solides.

PHPStan ne remplace pas les tests, mais il évite de devoir tester que null n’a pas de méthode getTitle(). Et ça, c’est déjà beaucoup.

Ressources utiles pour aller plus loin

Envie d’essayer ?

Commence niveau 0, monte progressivement, active la baseline sur ton vieux code, et vise le niveau 8 ou 9 sur les nouveaux modules. Ton futur toi te dira merci.

Et si tu veux aller plus loin : active le mode strict rules, installe les extensions framework, et plonge dans la doc. Tu verras, PHPStan, c'est un peu le Jiminy Cricket de ton code : chiant, mais utile.