# Programmation PHP/Analyse statique de programmes

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]
PHP offre plusieurs outils d'analyse statique de programmes (ou analyse de code statique).

## microtime et memory_get_usage

Pour mesurer un temps d'exécution dans le code, on peut utiliser des fonctions natives :

## phpcs

PHP_CodeSniffer liste ou corrige les violations des normes de codage.

### Lancement

NB : le fait de préciser l'utilisation de la PSR12 évite les erreurs inutiles sur les espaces autour des points de concaténation.

### Configuration

* phpcs : liste les mauvaises pratiques.
* phpcbf : corrige celles qui le sont automatiquement.
* ruleset.xml : liste des vérifications à vérifier ou à exclure (ce qui évite de tout préciser en argument de la commande).
Pour ignorer une erreur, ajouter un commentaire :
* Sur un fichier : // phpcs:ignoreFile
* Sur une ligne : // phpcs:ignore

### Configuration

Voici un exemple de fichier phpcs.xml.dist :

## phpinsights

Ajoute declare(strict_types=1); dans tous les fichiers, et formate code code et le style.

### Lancement

Pour la vérification :
Pour réparer automatiquement, ajouter "--fix".

### Configuration

Voici un exemple de fichier phpinsights.php :

## phpmd

PHP Mess Detector recense les mauvaises pratiques du type "code mort", paramètre inutilisé, mauvais nommage camelCase, présence d'un exit, etc..

### Configuration

Comme CodeSniffer, il utilise un fichier XML pour lister les vérifications à inclure ou exclure.
Exemple de fichier rulesets.xml :
De plus, pour exclure une classe d'une analyse, on peut placer le nom de l'analyse dans une annotation de la classe. Ex :
Ou tout ignorer :

## phpmetrics

Outil d'analyse fournissant un rapport graphique.

### Configuration

Éviter de versionner les rapports avec l'application. Par exemple ajouter "reports" au .gitignore.

## phpstan

PHP Static Analysis détecte des erreurs potentielles à l'exécution (ex : mauvais type) sans réellement exécuter le code.

### Installation

Voir plus pour vérifier l'utilisation de certaines dépendances :

### Configuration

Pour ignorer une erreur sur un élément, il y a trois solutions :
* utiliser une annotation sur la ligne précédente :
* ou sur la même ligne :
* ou préciser dans le fichier de configuration (phpstan.neon), le dossier à exclure de l'analyse ou le message d'erreur à ignorer.
Exemple de fichier phpstan.neon :
Le champ "level" va de 0 (violations les plus graves) à 9 (bonnes pratiques idéales). Donc plus il est haut et plus il y a de vérifications.

## psalm

Psalm cherche à détecter des bugs, par exemple des erreurs de type.

### Configuration

Pour ignorer une erreur, ajouter l'annotation de la fonction concernée :
En effet, les métriques telles que les taux de duplication ou de couverture du code (par les tests automatiques) sont révélatrices de la qualité du projet. Pour les mesurer il existe plusieurs outils :

## php-scrutinizer

Comprend des analyses de sécurité et de performances.

## GrumPHP

Idem.

## SonarQube

Il s'agit d'un logiciel de qualimétrie dont la version gratuite supporte PHP.
Il nécessite trois composants :
* le serveur, qui stocke les analyses et permet de les visualiser sur un dashboard. Il est téléchargeable gratuitement, ou utilisable dans sa version payante SonarCloud pour ne pas avoir à héberger le serveur soi-même. Identifiant par défaut : admin / admin.
* le scan, client qui envoie les analyses au serveur. A l'instar du serveur, il est disponible au téléchargement en multi-plateforme (via Java) ou sur Docker.
* un plugin PhpStorm (SonarLint) pour suggérer des améliorations en cours de frappe.

### Exemples

Pour lancer le scan sur un projet Symfony installé sur Windows (dans un .cmd) :
Sur Docker :
Pour remplir le taux de couverture de code, il faut ajouter le lien vers un rapport PhpUnit :

## Makefile d'analyse

Pour éviter de retenir toutes ces commandes, on peut les inclure dans le composer.json à la rubrique "scripts", ou dans un Makefile.
Exemple sur Symfony :

## Références

* ↑ https://github.com/squizlabs/PHP_CodeSniffer
* ↑ http://pear.php.net/package/PHP_CodeSniffer/redirected
* ↑ https://github.com/phpmd/phpmd
* ↑ https://github.com/phpstan/phpstan
* ↑ https://phpstan.org/user-guide/rule-levels
* ↑ https://psalm.dev/docs/
* ↑ https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/
* ↑ https://github.com/phpro/grumphp