Vérifier en masse la syntaxe des fichiers PHP

Si vous utilisez un gestionnaire de version (SVN, CVS, git, …) et que votre intégration continue joue de manière automatisée vos différents tests, cette commande peut vous être utile. En effet, il ne vous est jamais arrivé d’avoir vos tests dans le rouges pour la simple raison que la syntaxe d’un de vos fichiers est incorrecte ?

Voici la formule magique :

# for i in `find . -print | grep -P ".*\php$."` ; do php -lf $i ; done

Explication morceau par morceau :

  • find . -print | grep -P ".*\php$." permet de récupérer tous les fichiers .php

    du répertoire courant (.) et de ses répertoires enfants.

  • Cette liste est traitée fichier par fichier (for i in … ; dodone) via php -lf,
    qui effectue une analyse syntaxique.

Voilà pour la base. Vous pouvez n’afficher que les fichiers effectivement erronés
en envoyant l’affichage dans la commande grep -v -i ‘no syntax errors’ via un pipe,
ce qui donne :

# for i in `find . -print | grep -P ".*\php$."` ; do php -lf $i | grep -v -i 'no syntax errors' ; done

Si vous utilisez un framework, vous pouvez aussi l’exclure de l’analyse en agrémentant
la commande de recherche des fichiers PHP d’un | grep -v suivi du nom du framework, par exemple :

# for i in `find . -print | grep -P ".*\php$." | grep -v symfony` ; do php -lf $i | grep -v -i 'no syntax errors' ; done

Une petite astuce : copiez cette chaîne dans un fichier script commençant par #!/bin/bash (ou tout autre interpréteur de votre choix), puis placez-le dans le répertoire hooks de votre dépôt Subversion, sous le nom pre-commit, et rendez-le exécutable (chmod +x).
Ce script sera alors invoqué à chaque commit de votre équipe, et fera échouer celui-ci en cas d’erreurs de syntaxe, ce qui vous permet de “sécuriser” l’exécution de vos tests unitaires.

Amusez-vous bien !

One Response to “Vérifier en masse la syntaxe des fichiers PHP”

  1. momochii said:

    mai 21, 11 at 23 h 15 min

    Great information! I’ve been looking for something like this for a while now. Thanks!


Leave a Reply