Les bonnes pratiques PHP

Le php est originellement un langage simple, efficace pour réaliser rapidement des pages web dynamiques, accessible par un grand nombre. Le revers de la médaille : des problèmatiques de qualité, de passage à l’echelle, de compatibilité…etc. L’évolution de php, vers les concepts de la POO, s’est accompagnée d’une évolution des pratiques et outils qui permettent de réaliser des développements industriels et qualitatifs  qui sont aujourd’hui completement aptes à être déployés dans des environnements « professionnels ». Nous proposons ici un petit tour d’horizon des outils (s’appuyant sur l’open source) et des bonnes pratiques à adopter pour développer sur ces technologies.

Environnement de développement (IDE)

Pour les besoins avancés de développement, il convient d’utiliser un IDE (Integrated Development Environment) qui permet d’augmenter la productivité en automatisant une partie des activités et en simplifiant les opérations. Les fonctions généralement attendues – avec php – sont :

  • Une coloration syntaxique

  • L’autocorrection

  • L’auto-complétion

  • L’intégration facilitée aux dépôts de code ou à des frameworks

  • Un débogueur et un profileur pour surveiller l’exécution du code

  • L’intégration à des outils externes (tests unitaires, déploiement, gestion de bases de données, éditeur UML, etc.)

On trouve, parmi les IDE open source pour PHP  :

Nom

Licence

Description

Aptana11

GPLv3

IDE orienté web avec des aides de saisie. Fonctionne de manière autonome ou sous forme de plugin dans Eclipse.

Netbeans12

GPL2

IDE conçu à l’origine pour le développement en Java mais aujourd’hui très polyvalent. Populaire auprès des développeurs. Dispose de nombreux plugins pour vérifier le code PHP13.

PHP-PDT14 (Eclipse)

EPL-1

Framework complet pour le développement PHP avec l’IDE Eclipse.

Note : les éditeurs de texte qui sont plus faciles à utiliser, disposent souvent de la colloration syntaxique et de l’autocorrection.

Convention de programmation

Dans le monde PHP, il existe des conventions de programmation (qui permettent la compréhsneion et le partage de code par les équipes de developpement) qui sont utilisées par les bibliothèques, frameworks et composants PHP : PSR 0 à 415, PEAR16 et Zend17. Si le choix de la convention peut dépendre de tel framework ou telle application, il convient d’en adopter une meilleur collaboration dans les developpements.

Des outils existent pour vérifier et corriger automatiquement le code selon la convention adoptée :

Nom

Licence

Description

PHP_CodeSniffer18

BSD

Outil de référence pour détecter les erreurs des règles PSR, PEAR et ZEND. Alternativement, il est possible de corriger automatiquement tous les erreurs en une seule fois avecle composant PHP Code Beautifier and Fixer19.

PHP Coding Standards Fixer20

MIT

Outil de l’éditeur de Symfony pour vérifier la conformité avec PSR-1 et PSR-2. Compatible également avec les éditeurs Atom et Vim.

PHPMD

GPLv3

Outil d’analyse de code PHP pour détecter les bugs, les codes non optimaux et les paramètres et méthodes non utilisées.

Note : ces outils peuvent fonctionner de manière autonome ou en lien avec les IDE open source comme Netbeans21 22 et Eclipse23.

Dépôt de code

La mise en place d’un dépôt de code, qui est un « réferentiel » auquel contribuent l’ensemble des développeurs d’un projet, présente un grand nombre d’avantages :

  • gérer les conflits d’édition de code

  • avoir un historique des modifications des uns et des autres

  • offrir la possibilité de revenir à une version antérieure

Les utilisateurs se connectent à un serveur de dépôt pour récupérer le code source d’une application et renvoyer les modifications apportées. Un système de branches et de tags permet de gérer les différentes versions du logiciel.

Il existe aujourd’hui plusieurs outils qui permettent de créer un dépôt de code :

Nom

Licence

Description

CVS

GPL

Outil historique pour la gestion centralisée de dépôts

Subversion24

Apache/BSD

Outil qui apporte des améliorations à CVS. De plus en plus abandonné au profit de Git. Reste très utilisé dans les entreprises qui gèrent du code fermé.

Git

GPLv2

Outil pour une gestion décentralisée des dépôts. Très populaire.

Mercurial

GPL

Alternative à Git pour la gestion décentralisée. En léger déclin.

Note : l’utilisation de Git est à privilégier par la simplicité de son utilisation, la possibilité de gérer facilement différentes branches, la possibilité d’avoir des dépôts locaux, son intégration avec de nombreux outils….

Moteurs de template

Le moteur de template permet de créer une séparation entre la logique applicative de la logique d’affichage. Ainsi les développeurs front-end peuvent à travers un moteur de template, fournir une syntaxe simple pour afficher des donnés préparées par des développeurs back-end. Le développement d’applications complexes se retrouve donc facilité avec l’utilisation d’un moteur de template.

Il existe de nombreux moteurs de template PHP open source :

Nom

Licence

Description

Twig25

BSD

Moteur de template par défaut de Symfony et sert de langage de template pour Drupal 8. Disponible également pour de nombreux frameworks PHP dont Symfony, CodeIgniter, Laravel et Zend Framework.

Smarty26

LGPL

Disponible pour de nombreux frameworks PHP dont Symfony27, CodeIgniter28, Laravel29 et Zend Framework30 ce qui facilitera la reprise des templates existants.

Framework

Un framework est prévu pour libérer les développeurs des aspects « bas niveau » pour leur permettre de se concentrer sur des aspects « métier ». L’idée de base est que tout ce qui est bas niveau et commun à tous les sites (accès base de données, routage de requêtes, cache, gestion d’utilisateurs, moteurs de rendu.) peut-être fait une fois pour toutes puis réutilisé pour tout le monde.

Un framework dispose :

  • de composants prêts à emploi pour implémenter des fonctionnalités usuelles

  • d’outils pour structurer et accélérer le développement

  • d’une convention de programmation pour rendre plus concis le code et faciliter la maintenance

Certains frameworks sont pensés pour faciliter la distinction entre le contrôleur pour le code de traitement, le template pour l’affichage HTML et le modèle pour l’accès aux données. Cette approche Modèle Vue Contrôle n’est pas une obligation même avec les gros frameworks mais bien une bonne pratique. Elle est recommandée lorsqu’on développe avec ou sans framework. Le MVC est aujourd’hui un « standard » dans le développement d’applications Web.


Illustration 2.2: Principe du Modèle Vue Contrôle (MVC)

Il existe un très grand nombre de frameworks PHP qui adoptent des philosophies et répondent à des besoins différents…..

Gestion des dépendances

Avec la prolifération des bibliothèques, frameworks et composants PHP, la gestion des dépendances devient rapidement un problème dans un projet. Le gestionnaire de paquets historique PEAR a progressivement été remplacé par Composer. Ce dernier liste les dépendances dans un fichier composer.json et se charge de les télécharger automatiquement et de paramétrer l’exécution automatique. Il est comparable à npm dans le monde de Node.js. Un grand nombre de librairies PHP sont compatibles avec Composer en particulier la grande majorité des frameworks PHP. Les paquets sont listés sur le site Packagist31 qui est le dépôt principal des librairies compatibles avec Composer. Les pratiques avancées

Outils de documentation et de production de code

Le PHP dispose d’outils qui permettent de gagner du temps entre la conception et la production de code. Ils permettent en particulier d’anticiper de nombreux problèmes et de donner des guides importants lors de la phase de développement. Ci-dessous, nous trouvons les types d’outils  :

  • Les Object Relational Mappings (ORM) permettent de créer des correspondances entre les classes PHP et les tables SQL pour faciliter l’accès aux bases de données. Ceux-ci seront abordés par la suite.

  • La génération automatique de la documentation technique à partir des commentaires et autres éléments présents dans le code source, ce qui permet de soulager le travail des développeurs.

Le tableau ci-dessous propose des outils de conception libres :

Nom

Licence

Description

PHPDocumentor32

GPL

Outil pour générer de la documentation technique en PHP. Il référence automatiquement l’ensemble des classes, méthodes, fonctions mises en place dans le code.

Doctrine33

MIT

Ensemble de bibliothèques PHP pour le stockage des bases de données et le mapping des objets. Il permet en particulier d’extraire les objets à partir d’un fichier de description.

Propel34

MIT

Alternative à Doctrine permettant d’extraire les objets à partir de la base de données. Disponible seulement à partir de PHP5.5.

Test et débogage

Tester le code devrait représenter une autre partie importante du travail d’un développeur. Plus une application est complexe et plus il devient difficile et long de vérifier toutes les combinaisons. Or ce travail est indispensable et doit être fait le plus en amont possible pour réduire le temps consacré aux corrections lors de la phase de recette.

L’automatisation des tests est la clé pour avoir un code de qualité et permet de gagner du temps lorsque les tests sont réalisés fréquemment. Pour le PHP, il existe deux types de tests :

  • Les tests unitaires qui consistent à isoler une méthode afin de vérifier qu’elle produit le résultat attendu en passant des paramètres déterminés

  • Les tests IHM ou de recette qui permettent de s’assurer que les comportements de l’application sont ceux attendus, notamment la saisie d’une valeur erronée doit produire un message d’erreur adapté. À noter que ces outils ne sont pas spécifiques au PHP comme par exemple Sélénium.

Pour les modifications du code, on distingue d’un côté la réécriture d’une partie de l’application, de l’autre la réorganisation des composants de l’application et l’optimisation de son fonctionnement. Seul le premier cas est sujet à une mise à jour des tests.

À côté de ces outils de test, il existe également deux autres types outils pour vérifier le code en temps réel :

  • Le débogueur qui permet d’exécuter étape par étape une application afin de s’assurer du bon cheminement dans le code. Il est possible de consulter à tout moment la valeur des variables et de définir des points d’arrêt.

  • Le profileur permet de recueillir des indicateurs sur les éléments qui interviennent lors de l’exécution de l’application (nombre et temps d’exécution, mémoire consommée…).

Les principaux outils de test et de débogage open source spécifiques pour PHP sont les suivants :

Nom

Licence

Description

PHPUnit35

GPL

Librairie PHP pour écrire des tests unitaires, il est inclu par défaut dans la majorité des frameworks PHP.Il peut également être ajouté sous forme d’un paquet Composer36. L’intégration dans les IDE Eclipse via PHP-PDT37 et Netbeans38 permet de lancer des tests automatiques et d’analyser les résultats.

SimpleTest39

GPL/LGPL

Autre outil de test unitaire PHP qui n’est cependant plus maintenu. Compatible avec Eclipse40.

PHPdbg41

PHP

Inclu nativement dans le code source PHP5.6+, c’est un module qui permet le déboguage en ligne de commande.

XDebug42

PHP

Installé sur le serveur PHP, il apporte les fonctions de débogage et profilage Il s’intègre bien aux IDE Netbeans43 et Eclipse44.

À noter que PHPUnit et Xdebug sont des librairies externes aux IDE. La connexion aux IDE facilite le suivi de l’état de l’application et des erreurs en cours d’écriture du code. À notre connaissance, ce sont les seuls outils de test et de débogage indispensables pour bien développer en PHP qui sont supportés et utilisés sur les IDE Netbeans et Eclipse.

Intégration continue

Pour les grands projets, un suivi en permanence des tests unitaires est intéressant. Il permet de remonter rapidement les régressions de code après toute modification. C’est l’objet de l’intégration continue qui déploie un serveur qui de manière automatique, extrait le code PHP du dépôt, déploie sur un serveur test et collecte les résultats et les publie visuellement. Dans la pratique, l’intégration continue tend à réduire les problèmes et accélérer le développement de l’application.

Le tableau ci-dessous présente trois solutions open source qui permettent la mise en oeuvre de l’IC :

Nom

Licence

Description

Jenkins-PHP45

CC BY-SA 3.0

Jenkins est le serveur d’intégration continue par excellence basé sur Java. Il est extensible avec plusieurs centaines de plugins. Des instructions et un template Jenkins spécifique pour des projets PHP.

PHPCI46

BSD

Outil spécifique pour PHP. Il a été conçu avec de la simplicité à l’esprit. Il ne dispose pas de toutes les fonctionnalités que propose Jenkins.

PHPUnderControl47

GPLv3

Outil historique pour l’intégration continue. Il n’est cependant aujourd’hui plus maintenu.

Les outils d’intégration continue pour le PHP sont apparus récemment dans l’écosystème du PHP. Il n’existe aujourd’hui pas de solution mature qui répond spécifiquement aux problématiques de développement du langage PHP48. C’est tout le contraire du Java qui dispose de Jenkins.

Il existe également des services d’intégration continue d’hébergement gratuits intégrées à Github comme Travis CI qui permet de ne pas devoir déployer son propre serveur d’intégration continue PHP49.

Déploiement automatique

Le déploiement consiste en l’export de l’application du dépôt, la copie des fichiers sur un serveur et le lancement de scripts de mise à jour. Il est souvent fait manuellement et peut être long si les serveurs, les technologies et les systèmes de protection en place sont nombreux. Il arrive également que la personne qui fait le déploiement oublie des étapes ou modifie l’ordre par mégarde. Dans la pratique, le rythme des déploiements et des tests de recette est plus espacé avec un ralentissement général du processus de développement. Il est indispensable aujourd’hui de faire du déploiement automatique dans un environnement de production.

L’automatisation permet de déployer en parallèle sur plusieurs serveurs, de programmer le retour en arrière en cas d’échec et d’installer plusieurs versions de tests. Il existe plusieurs façons de faire :

  • Écrire un script Shell contenant les commandes à passer manuellement

  • Utiliser un outil d’automatisation de tâches dédié

Les IDE offrent quelques facilités dans le lancement du processus de déploiement notamment avec l’enregistrement des configurations de déploiement récurrent. Les outils de déploiement automatique se différencient par une prise en charge plus globale à travers les opérations telles que :

  • La gestion des dépendances

  • L’exécution de tests automatiques

  • La manipulation des fichiers et dossiers et leur accès

  • Les opérations sur des bases de données

  • La gestion de versions

  • Le déploiement sur un serveur

Dans le cadre d’un déploiement à grande échelle, il est possible d’utiliser les outils de déploiement automatique open source pour PHP suivants :

Nom

Licence

Description

Phing50

LGPLv3

Outil pour faire du déploiement automatique PHP à partir d’un simple fichier XML. Il fournit des tâches de base pour installer ou mettre à jour une application web et peut être étendu à d’autres tâches.

Capistrano51

MIT

Outil avancé pour exécuter des commandes de manière structuré et répété sur un ou plusieurs machines. Le déploiement des applications PHP avec cet outil nécessite une bonne compréhension de Ruby et de Rake.

Deployer52

MIT

Outil PHP simple et fonctionnel qui peut faire des déploiements en parallèle, des déploiements atomiques (sans interruption de service). Des « recettes » sont disponibles pour les tâches des principaux frameworks PHP.

À noter que les frameworks PHP ont également souvent leur propre outil de ligne de commande pour faire du déploiement rapidement.

À noter également qu’il existe d’autres outils comme Puppet ou Ansible qui ne gèrent cependant que la configuration des applications.

 Synthèse

L’industrialisation de la filière PHP s’accompagne des bonnes pratiques suivantes :

  • Adopter un référentiel qualité PHP résumé en une liste de dix recommandations maximum pour l’écriture du code PHP

  • Utiliser un IDE unique pré-configuré pour standardiser le développement

  • Constituer et utiliser le dépôt de code commun pour les applications PHP

  • Mettre en place le déploiement automatique

  • Vérifier que la documentation technique est réalisée et à jour

  • Adopter un framework PHP décliné en version simple et avancée

  • Mettre en place l’intégration continue pour les projets avec un cycle de vie long

  • Faire un audit du code croisé en binôme à chaque étape importante pour vérifier que l’application des bonnes pratiques

  • Organiser des points de rencontre réguliers pour échanger et faire évoluer les pratiques de développement

Références

19https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically

20http://cs.sensiolabs.org/     (site inaccessible)

22http://plugins.netbeans.org/plugin/49042/php-cs-fixer

23http://marketplace.eclipse.org/content/pti-php-tool-integration

25http://twig.sensiolabs.org/     (site inaccessible)

39http://www.simpletest.org/     (site inaccessible)

40http://www.simpletest.org/en/extension_eclipse.html     (site inaccessible)

48https://continuousphp.com/tutorial/introduction-continuous-delivery/