Niveau Niveau confirmé

Analyser du code PHP avec PHPStan

Articledéveloppement

Publié par le (153 lectures)

php analyse linting

PHPStan est un outil d’analyse statique de code PHP assez simple à utiliser.

Si vous développez des petits ou moyens projets, par exemple des sites WordPress cela peut vous aider à augmenter la qualité de votre code et détecter les bugs.

Capture d'écran du site PHPStan

Ainsi PHPStan va :

  • 📁 analyser la globalité ou un dossier spécifique (ex : votre thème WordPress)
  • 🐛 repérer les erreurs potentielles, les avertissements, les bugs
  • 📰 écrire le résultat dans un fichier de log

Le log va ressembler à ceci :

------ ----------------------------------------------------------------------------------
  Line   wwww/functions.php                                                               
 ------ ----------------------------------------------------------------------------------
  :10    Access to an undefined property object::$ID.
  :77    Variable $wp_query might not be defined.  
  :377   Function add_wiki_link() has no return type specified.                           
  :379   Parameter #5 $callback of function add_menu expects callable(): mixed, '' given. 
 ------ ----------------------------------------------------------------------------------

Selon votre niveau de connaissance de PHP, ces retours peuvent sembler obscurs, mais on s'y retrouve vite avec un peu d'entraînement.

D'où vient ce nom ? de PHP Static Analysis !

Wow ! Mindblown !

Qu'est-ce que l’analyse statique ?

L’analyse statique consiste à examiner le code source, sans le lancer, pour identifier sur ~10 niveaux (dans le cas de PHPStan) :

  • les erreurs
  • les incohérences de typage
  • les problèmes potentiels de logique
  • plein d’autres trucs

Concrètement : variables qui n’existent pas, fonctions déclarées avec 2 arguments mais appelées avec 3, etc.

On peut aussi s’en servir pour s’assurer par avance de la compatibilité avec une version upgradée de PHP.

Encore un outil de plus ? Oui et non : s’il est intégré par défaut dès le début d'un projet et qu’on connaît la commande, cela permet de gagner du temps en repérant/comprenant un bug potentiel durant / à la fin du développement.

Installation

Avec composer, c'est assez rapide : composer require --dev phpstan/phpstan, ce qui l'ajoute aux dépendances de développement dans composer.json :

  "require-dev": {
    "phpstan/phpstan": "^1.12"
  },

Ainsi on pourra lancer vendor/bin/phpstan analyse public/themes >phpstan.log et lire les contenus du fichier log.

On peut aussi ajouter un script dans composer.json :

  "scripts": {
    "phpstan": "phpstan analyse --memory-limit 1024M >phpstan.log"
  }

Ce qui permettra de le lancer plus aisément avec composer phpstan.

Configuration

On ajoute un fichier phpstan.neon qui va contenir des paramètres basiques :

  • scanDirectories: permet de prendre connaissance des déclarations PHP existantes
  • scanFiles : permet de connaître des variables déjà définies
  • level : niveau d'exigeance
  • paths: liste des chemins réellement analysés

Exemple concret pour un projet WordPress

parameters:
    scanDirectories:
      - public/wordpress
      - public/plugins
      - public/mu-plugins
    scanFiles: # permet de connaître des variables custom
      - public/wp-config.php
    level: max
    paths:
      - public/themes

On pourra aussi ajouter des règles à ignorer (les plus inoffensives évidemment) lorsqu'on le nombre de lignes relevées est trop important et qu'on ne peut pas tout ré-adapter dans un framework qui ne satisferait pas pleinement PHPStan.

    ignoreErrors:
      - '#Cannot access offset .*#'
      - '#Cannot access property .*#'
      - '#Parameter .* of echo cannot be converted to string#'
      - '#Parameter .* function .* expects .* mixed given#'
      - '#While loop condition is always true#'
      - '#code above always terminates#'

Autres outils ?

Ce n'est pas le seul de sa catégorie, il existe aussi

Pas mal non ?

Un éléphant cool avec des lunettes de soleil pixellisées

Commenter

Vous devez être inscrit et identifié pour utiliser cette fonction.

Connectez-vous (déjà inscrit)

Oubli de mot de passe ? Pas de panique, on va le retrouver

Pas encore inscrit ? C'est très simple et gratuit.