Analyse statique en PHP avec PhpMetrics

Premiers pas

Jean-François Lépine

Ce tutorial vous guidera pour découvrir PhpMetrics, un logiciel d'analyse de code pour PHP, et pour comprendre certains indicateurs qu'il fournit.

Vous pouvez donner votre avis sur le contenu de ce cours sur le forum PHP : Commentez

- Titre : Analyse statique en PHP avec PhpMetrics

- Auteur : Jean-François Lépine

- Parution : 9 décembre 2015

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 Jean-François Lépine. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Présentation

- II. Installation

- III. Première utilisation

- IV. Lire le rapport

- IV-A. Onglet Overview

- IV-A-1. Maintenabilité applicative

- IV-A-2. Graphique personnalisé

- IV-A-3. Courbe d'abstraction et d'instabilité

- IV-B. Onglet Relations Map

- IV-C. Onglet Explore

- V. Aller plus loin

I - Présentation

PhpMetrics est un outil d'analyse statique de code ; c'est-à-dire qu'il lit un code source pour en extraire des informations, notamment sur la maintenabilité, la complexité, la cohésion…

À la différence d'autres outils, comme l'excellent PhpDepend, ou la suite d'outils référencée PHPQATools (PhpLoc, PhpDcd, etc.), PhpMetrics se focalise sur des critères de qualité d'un code source : indice de maintenabilité, effort de compréhension ou encore difficulté de lecture du code… Il fournit un très grand nombre d'indicateurs.

L'un des premiers objectifs de cet outil est également de rendre lisibles les rapports d'analyse, même pour les débutants.

Je vous propose de découvrir comment utiliser PHPMetrics, et comprendre les informations fournies par cet outil.

PhpMetrics est supporté par www.qualiboo.com, plate-forme en ligne de suivi de la qualité de projets web.

II - Installation

Vous aurez besoin de PHP 5.3 au minimum. Commencez par télécharger le phar de PhpMetrics (phpmetrics.phar) et enregistrez-le à l'emplacement de votre choix (par exemple dans le dossier c:/dvp/).

Ouvrez votre terminal, placez-vous dans le dossier de téléchargement (c:/dvp), puis lancez la commande suivante :

php phpmetrics.phar --version

Vous devriez voir s'afficher la version de PhpMetrics (1.0.0 dans cet exemple).

III - Première utilisation

Imaginons que vous souhaitiez analyser le projet PHP qui se trouve dans le dossier C:/monprojet. Vous allez devoir lancer la commande suivante :

php phpmetrics.phar --report-html=report.html c:/monprojet

L'analyse peut prendre quelques minutes. Remarquez que nous utilisons le paramètre --report-html=report.html pour générer un compte-rendu HTML de notre analyse dans le fichier « report.html ».

À l'issue de l'analyse, vous obtiendrez quelque chose de similaire à cette capture d'écran :

Ne vous souciez pas du tableau de valeurs pour le moment, nous lirons ces mêmes chiffres de manière plus attractive dans un navigateur web grâce au rapport HTML qui a été généré.

IV - Lire le rapport

Le fichier « report.html » a été généré par PhpMetrics. Ouvrez-le dans votre navigateur favori.

La page est découpée en trois onglets principaux :

- Overview : aperçu général du code. C'est l'onglet le plus utilisé ;

- Relations map : aperçu des relations qu'ont les classes entre elles dans votre code ;

- Explore : permet de naviguer de classe en classe.

IV-A - Onglet Overview

C'est l'onglet le plus « visuel » et le plus utilisé de PhpMetrics. Il contient une synthèse de l'analyse de votre code.

Cette partie est composée de trois sections :

1. Le graphique de maintenabilité ;

2. Le graphique personnalisé ;

3. La courbe d'abstraction/instabilité.

IV-A-1 - Maintenabilité applicative

Ces bulles colorées (chaque cercle représente un fichier) indiquent deux choses :

- leur couleur indique l'indice de maintenabilité du code ;

- leur taille indique la complexité cyclomatique du code

Si vous êtes daltonien, n'hésitez pas à cocher « I'm colorblind ». Les couleurs seront remplacées par des hachures plus accessibles.

L'indice de maintenabilité est un indicateur qui donne… la maintenabilité du code concerné. Cet indicateur est calculé sur de nombreux critères : le volume du code, la complexité, le nombre de lignes, le poids des commentaires… Il existe plusieurs formules possibles pour calculer cet indice, si vous êtes curieux, vous pouvez jeter un œil à la formule utilisée directement dans le code source.

Il s'agit d'une note de 0 à 118, 118 étant la meilleure note, 0 la plus mauvaise. On considère en général qu'un code avec :

- un score supérieur à 85 est très maintenable ;

- un score supérieur à 65 est relativement maintenable ;

- un score inférieur à 65 est difficilement maintenable.

La complexité cyclomatique est un indicateur assez classique qui représente la complexité du code source. En schématisant, chaque accolade (if, foreach, while...) et chaque opérateur logique augmentent ce score de 1. Une grande complexité cyclomatique indique généralement un code dont l'algorithme est complexe.

La complexité cyclomatique est un indicateur assez décrié, car il ne tient pas compte de la « profondeur » du code : un « if » dans une boucle a le même poids que deux « if » imbriqués, alors que le code est bien plus complexe.

C'est pour cela que PhpMetrics indique également l'intervalle de Myer, qui lui tient compte de cette différence.

Un cercle petit et vert est donc probablement plus maintenable qu'un cercle grand et rouge.

IV-A-2 - Graphique personnalisé

Ce graphique permet d'afficher n'importe quel indicateur. Il suffit de le sélectionner dans les listes déroulantes, en choisissant s'il représente la taille des cercles, leur position sur l'axe X ou leur position sur l'axe Y.

Par défaut, sont sélectionnés :

- taille des cercles : le nombre de lignes de code (LOC) ;

- axe X : manque de cohésion des méthodes (LCOM4) ;

- axe Y : la complexité cyclomatique (CC).

Vu que nous avons déjà parlé de la complexité cyclomatique, examinons cet indicateur : le manque de cohésion des méthodes (Lack of Cohesion of methods)

Prenons ce code :

<?php
class Example {
private $a;

public function m1() {
$this->m2();
}

public function m2() {
$this->a = 1;
}

public function m3() {
$this->a = 1;
}

public function m4() {
$this->m5();
}

public function m5() {
echo 'ok';
}
}

Si on regarde bien, on distingue deux flux de code dans cette classe :

1. m1()utilise m2(). m2()partage avec m3() un attribut en commun a.

2. m4() utilise m5().

On peut donc logiquement en déduire que cette classe a probablement plusieurs responsabilités (au moins deux), et qu'elle pourrait probablement être redécoupée en deux classes distinctes pour respecter le principe de responsabilité unique.

Cette classe possède deux flux de méthodes. Son indice de manque de cohésion des méthodes est donc de 2.

IV-A-3 - Courbe d'abstraction et d'instabilité

L'abstraction concerne la souplesse d'un code. Plus un code utilise de composants abstraits (interfaces) plutôt que concrets (des classes) plus son abstraction est haute, et plus il sera facile de le faire évoluer.

La stabilité indique la résistance au changement d'un code source. Cet indicateur est directement corrélé à l'interdépendance des classes entre elles, qui détermine s'il sera facile de les faire évoluer sans tout casser (code spaghetti).

Ces indicateurs sont donc calculés selon différentes informations :

- le nombre de classes utilisées par une autre (AC) ;

- le nombre de classes dont dépend la classe courante (EC).

Si vous êtes curieux, n'hésitez pas à jeter un œil au code source (Abstraction, Instabilité) pour en savoir plus.

Le code le plus instable et concret est donc en bas à droite, tandis que le code le plus stable et abstrait en haut à gauche. En théorie un code en bas à droite a un coût de production très faible et un coût de maintenance très élevé (et vice-versa).

Toutefois, il existe des paliers : un équilibre peut (doit) exister entre l'instabilité et l'abstraction.

Imaginons qu'une classe ait une abstraction A=5 et une instabilité I=5. Cette classe est partiellement évolutive, car partiellement abstraite, et partiellement stable, car ces évolutions ne sont pas sujettes à une instabilité maximale.

On dit alors que cette classe est sur un chemin intermédiaire (« Main Sequence »). Dans la vraie vie, c'est sur ce chemin intermédiaire qu'un code classique devrait se situer pour être pragmatique. L'écart entre la classe et ce chemin intermédiaire est noté distance.

IV-B - Onglet Relations Map

Cette page affiche de manière visuelle les relations entre vos classes. Il n'a d'autre objectif que de vous permettre de visualiser le degré d'interdépendance de votre code.

Vous pouvez survoler une classe (appelons-la « classe A »). Les traits rouges indiqueront les classes qui utilisent votre « Classe A ». Les traits bleus indiqueront les classes utilisées par votre « Classe A ».

IV-C - Onglet Explore

Cet écran vous permet de visualiser directement certains indicateurs classe par classe et espace de noms par espace de noms. Il vous offre une vue détaillée de votre code.

V - Aller plus loin

J'espère que cette découverte de PhpMetrics vous a donné envie d'aller plus loin. Sachez par exemple qu'il est très simple d'intégrer PhpMetrics sur une plate-forme d'intégration continue (comme Jenkins).

Si vous êtes curieux, vous pouvez également consulter les résultats des analyses pour de nombreux frameworks PHP (Symfony2, Zend, CakePHP, Wordpress… )

Par ailleurs, sachez qu'un plugin PhpStorm existe, même s'il a besoin d'amélioration.

Enfin, sachez qu'il existe de nombreux indicateurs non présentés dans les rapports de PhpMetrics, car difficiles à représenter, mais également de nombreux indicateurs qui ne sont pas encore calculés. Votre aide est la bienvenue pour aider à améliorer cet outil.

Tout retour d'expérience et toute contribution sont les bienvenus.