Migration de PHP 4 vers PHP 5
Le support de PHP 4 appartient au passé. Il devient donc urgent de migrer vers PHP 5 car en 2008 nulle nouvelle version de PHP 4 ne verra le jour (un support sera tout de même assuré sur les failles de sécurité jusqu'au 08/08/2008).
La compatibilité entre PHP 5 et PHP 4 a été une des préoccupations majeures durant le développement de PHP 5. Une grande majorité des applications devraient pouvoir être exécutées sur PHP 5 sans problèmes, ou ne nécessiter que des modifications mineures. Il existe cependant quelques différences et nous allons essayer de les résumer ici pour vous permettre une migration simple.
Pourquoi migrer ?
- Nouvelles fonctionnalités
- Meilleures performances
- Meilleure sécurité
- Meilleure stabilité
- PHP 5 est fortement supporté
Ce qui a changé avec PHP 5 ?
- la refonte du coeur de PHP qui permet une prise en charge complète de la programmation orientée objet
- la refonte de la prise en charge de XML
- l’intégration de la base de données embarquée SQLite
- l'intégration de nouvelles extensions (JSON, Filter, ZIP, ...)
- l’apparition d’un socle commun pour la gestion des appels aux bases de données : PHP Data Object (PDO)
- l'utilisation de la reflexion objet ( introspection )
- les exceptions ont fait leur apparition en PHP5
- un niveau d'erreur E_STRICT à été ajouté
- apparition de la SPL (Standard PHP Library), un rassemblement de classes internes utiles
Bien que la plupart des scripts PHP 4 existants devraient fonctionner, il convient de noter quelques différences majeures pouvant entraîner des erreurs ou des comportements différents :
- la gestion des objets (passage par référence)
- la refonte du support de DOM avec l'abandon de l'extension DomXML
- l'extension MySQL n'est plus incluse par défaut
- nouveau mode d'erreur E_STRICT
Le nouveau modèle objet
La principale nouveauté de PHP 5 est certainement le nouveau modèle objet. Le traitement des objets a complètement été réécrit pour arriver à de meilleures performances et plus de fonctionnalités. A ce jour le modèle objet de PHP 5 est proche de celui de Java, il en résulte donc un certain nombre de nouveautés : méthodes magiques, visibilité, (était déjà présent en PHP4, la nouveauté c'est le destructeur ou plus généralement les méthodes magiques), encapsulation, clonage, interfaces, classes abstraites...
Les objets sont passés par référence
Dans PHP 4 l'objet en entier était copié lorsqu'il était assigné ou passé comme paramètre à une fonction. Dans PHP 5 les objets sont référencés par un pointeur et non pas leur valeur (on peut penser à un pointeur en tant qu'identifiant d'objet).
Passer un objet par référence
Les objets ne sont donc plus passés par valeur mais par référence. Il en résulte qu'une fois transmis à une fonction, un objet PHP 5 verra ses valeurs évoluer alors qu'en PHP 4 c'est une copie qui sera modifiée au sein de la fonction, l'objet originel restera inchangé.
En PHP 4 pour faire passer un objet en référence on pouvait le faire en préfixant la variable avec le signe « & ». Testez notre exemple Xxxx en enlevant le « & » dans la déclaration de la fonction « fctActionObjet() », vous verrez que dans un cas l'objet « $b » est modifié et dans l'autre il ne l'est pas (et pour cause la modification a été faite sur une copie temporaire).
Passage des objets par copie en PHP 4<?php// Classe PHP 4class ClassA{var $nom;function ClassA($var){$this->nom = $var;}function changeNom($var){$this->nom = $var;}}// Fonction prenant un objet en paramètre// et changeant une valeur.function fctActionObjet(&$obj){$obj->changeNom('Pierre');}$b = new ClassA('Cyril');fctActionObjet($b);?>
Passage des objets par référence en PHP 5<?php// Classe PHP 5class ClassA{private $nom;function __construct($var){$this->nom = $var;}function changeNom($var){$this->nom = $var;}}// Fonction prenant un objet en paramètre// et changeant une valeur.function fctActionObjet($obj){$obj->changeNom('Pierre');}$b = new ClassA('Cyril');fctActionObjet($b);?>
Dupliquer un objet
Vu que les objets sont passés par référence en PHP 5, une méthode spécifique à été ajoutée afin de les dupliquer : clone().
Clonage d'objet en PHP 4<?php// Classe PHP 4class ClassA{var $nom;function ClassA($var){$this->nom = $var;}function changeNom($var){$this->nom = $var;}}$b = new ClassA('Cyril');$newObj = $b;?>
Clonage d'objet en PHP 5<?php// Classe PHP 5class ClassA{private $nom;function __construct($var){$this->nom = $var;}function changeNom($var){$this->nom = $var;}}$b = new ClassA('Cyril');$newObj = clone($b);?>
Heureusement grâce au travail du PHPGroup ces changements cassent que peu la compatibilité et PHP interprète souvent le code PHP 4 pour le rendre compatible avec PHP 5.
Quelques informations supplémentaires :
- PHP5 rajoute aussi la visibilité objet : protected / private / public, les interfaces, les classes abstraites, l'autoloading de classes et le typage fort objet
- Le mot clef « var » utilisé en PHP 4 fonctionne en PHP 5, il est traduit en « public ».
- Le constructeur de classe utilisé en PHP 4 (fonction ayant le même nom que la classe) fonctionne avec PHP 5.
- Il n'est pas nécessaire d'enlever les « & » qui étaient utilisés dans le code PHP 4 pour simuler le passage par référence. Vous aurez cependant un message d'erreur si vous êtes en mode « strict »
Nouveaux mots-clés réservés
PHP 5 a amené son lot de nouveaux mots réservés. Il s'agit d'identifiants prédéfinis en PHP qui ne doivent pas être utilisés comme constante, nom de classe, nom de fonction ou nom de méthode dans vos scripts.
interface | implements | clone | try |
catch | public | private | protected |
throw | this | final | static |
En règle générale vous pourrez avoir des incompatibilités sur ce qui touche à la POO pour des noms de fonctions / méthodes que vous avez implémentés pour simuler des comportements objets avancés non supportés par PHP 4.
Il existe d'autres mots réservés, consultez la documentation en ligne pour en avoir la liste intégrale à l'adresse : http://www.php.net/manual/fr/reserved.php
XML
Les autres nouveautés concernent la gestion de XML. La version 4 de PHP impliquait une utilisation relativement lourde pour qui souhaitait manipuler des flux XML. Avec la version 5, deux nouveautés révolutionnent sa manipulation :
- L’intégration d’un nouveau gestionnaire XML : la bibliothèque libxml2, qui amène une implémentation DOM standard complète (ce qui n'était pas le cas en PHP 4) ;
- L’extension SimpleXML.
La première permet de traiter tous les aspects de la manipulation XML, avec la complexité que cela implique. La seconde s’adresse à tous les traitements XML simples. Il n’est plus obligatoire de passer par des opérations compliquées pour récupérer les données de fichiers XML.
Les incompatibilités peuvent venir des changements liés à l'implémentation DOM complète de PHP 5 qui sera incompatible avec celle utilisée en PHP 4. On peut noter une amélioration de la compatibilité de cette extension à partir de PHP 4.3 mais dans tous les cas tout ce qui n'est pas objet ne sera pas fonctionnel en PHP 5.
Si vous utilisiez l'extension DomXML pour parser du XML il est temps de réécrire votre code. Au pire des cas vous pouvez installer DomXML à partir du repository PECL.
Bases de données
Pour des raisons de licence l'extension mysql n'est plus embarquée par défaut dans le package PHP 5. Ce n'est pas grand chose, cela veut juste dire que les extensions ne sont plus activées par défaut. Il vous faudra juste l'indiquer lors de la compilation. De façon générale cela ne vous concerne que si vous compilez vous même PHP : La majorité des auto-installeurs PHP (WAMP5, XAMP, MAMP, EasyPHP) embarquent MySQL chargé par défaut.
Divers
En PHP 5, la nouvelle constante de rapport d'erreurs E_STRICT a été introduite avec comme valeur 2048. Cela permet à PHP, lors de l'exécution, de faire des suggestions sur la compatibilité et le suivi de votre code. Ceci vous incite à toujours utiliser les meilleures méthodes de codage et les plus récentes : par exemple les messages stricts vous avertiront sur l'utilisation de fonctions obsolètes et l'utilisation de variables non déclarées.
Preparer et tester sa migration
Validateur de code
Sous Linux il est possible de tester la compatibilité de vos scripts en ligne de commande. Pour cela placez toute votre arborescence PHP sur un serveur utilisant PHP 5. Connectez vous à ce serveur en root et tapez la ligne de commande suivante :
find /source/repertoire -name \*.php | xargs -n1 /chemin/vers/php -ddisplay_errors=1 -derror_reporting=8191 -l
Le niveau d'affichage d'erreur est tel (8191 : E_ALL | E_STRICT ) que toutes les erreurs de code ou tous les appels à des fonctions/fonctionnalités dépréciées généreront une erreur. Ce que ce validateur vous indique :
- Si les fichiers sont exécutés sans erreurs
- Si vous n'utilisez pas de fonctionnalités / fonctions dépréciées.
Attention cette méthode ne vous donnera pas toutes les informations. Notamment vous n'aurez pas de message d'erreur quand un objet n'utilise pas la fonction clone() pour se copier.
Le code suivant vous affiche une erreur sur la ligne « $a = & new agent(); » car il n'est plus nécessaire d'utiliser le « & ».
Exemple de code PHP 5 forçant le passage par référence de l'objet<?phpclass agent{public $nom;}$a = & new agent();?>
Utiliser WampServer
WampServer est un outil qui vous permet de déployer une plateforme Apache PHP 5 MySQL sur votre poste de travail Windows sans coup férir. Une des grandes qualités de ce logiciel est de disposer d'un système d'add-ons. L'un d'eux, le plus connu, permet de switcher de PHP 5 vers PHP 4 et vice versa.
Ainsi une manière empirique de tester la migration de votre logiciel serait de l'installer en local avec WampServer sous PHP 4, de le tester puis de switcher en PHP 5 et de le tester à nouveau.
Pour automatiser les tests vous pouvez utiliser un outil tel que l'extension firefox « selenium-ide » qui permet de définir des scénarios de tests extrêmement simplement.
Conclusion
Faire fonctionner vos applications développées pour PHP 4 dans un environnement PHP 5 ne devrait pas vous demander énormément de temps. Surtout si vous n'utilisez pas de programmation orientée objet.
En fait le réel intérêt de cette migration réside dans l'énorme potentiel que vous offre PHP 5 au travers de toutes les nouveautés qu'il offre. Alors n'hésitez pas, foncez vers PHP 5 !
Auteur
Cyril Pierre De Geyer est responsable technique de la société Anaska (www.anaska.com) spécialisée dans les formations relatives aux technologies Open Source. Il est co auteur du livre « PHP5 Avancé » aux éditions Eyrolles, est co-fondateur de l'Association française des utilisateurs de PHP (http://www.afup.org) et participe aux sites PHPteam.net et PHPfrance. Il a à son actif professionnel des références d'audit, de développement et de formation (Canal +, France 3, EPITA, Urssaf.,.). Son expertise l'a amené à intervenir lors de nombreuses conférences nationales et internationales.
Les commentaires
2. Par allegromartin le 04/12/2008 23:58
Cette article est très bien construit, il est très compréhensible. BRAVO !
1. Par Alexandre le 11/03/2008 18:51