PHP 7 : et si c’était déjà le moment de migrer ?

Temps de lecture estimé : 10 minute(s)

*Attention, ce contenu a été publié il y a 3 années. Il n'est peut-être plus d'actualité.*

Ces dernières années, les versions mineures de PHP successivement proposées ont fortement amélioré les performances du langage. La communauté autour de PHP s’est professionnalisée et a mis à disposition des développeurs de nombreux outils pour améliorer l’utilisation du langage et la maintenance de leurs applications. La sortie de PHP 7, qui succédera à PHP 5, est annoncée pour le 12 novembre prochain comme un événement majeur. Pour quelles raisons ? Allons voir ce qui se cache sous le capot de PHP 7.

(Re)découvrir l’article « Non, le langage PHP n’est pas mort ! »

Le 5 à 7 de PHP : un égarement passager

Les informaticiens sont-ils fâchés avec les mathématiques ? Après Microsoft, qui passe de Windows 8 à Windows 10, PHP choisit donc à son tour de s’absoudre des règles basiques de l’arithmétique en proposant, à la suite de PHP 5, une version 7. Cette bizarrerie s’explique en effectuant un petit retour en arrière. En 2004, après la sortie de PHP 5, le projet d’une version 6 est engagé, avec l’objectif principal d’intégrer Unicode au langage. Ceci pour permettre de standardiser les caractères spéciaux. Pour faire simple, sans Unicode, on ne peut pas écrire : « I ❤ PHP ».

De mauvaises décisions et un manque de motivation ont conduit les développeurs de PHP à stopper le travail autour de cette version en 2010. Les détails techniques de ce choix sont disponibles sur cette présentation d’Andrei Zmievski . Les développeurs se sont alors concentrés sur des améliorations plus pragmatiques et les ont intégrées au sein de versions mineures jusqu’en 2014.

Lorsque les développeurs de PHP ont planché sur la roadmap de la version majeure suivante, ils se sont très vite posé la question du nom à lui donner (consulter les éléments du débat ). Des articles et plusieurs livres étaient sortis entre temps, évoquant la version 6 avortée, si bien qu’il existait un risque de confusion pour les utilisateurs cherchant de la documentation sur la dernière version de PHP. Par ailleurs, la communauté était désireuse de tirer un trait définitif sur cette mésaventure. C’est pourquoi les développeurs se sont massivement prononcés pour l’appellation PHP 7 .

Cette nouvelle version de PHP est le fruit de plus d’un an et demi de travail, et il est difficile d’être exhaustif sur toutes les nouveautés qu’elle apporte. Concentrons-nous sur les points les plus importants.

PHP 7 : deux fois plus rapide que PHP 5.6

La concurrence a souvent du bon. Pour ses propres besoins, Facebook a créé en 2011 une plateforme d’exécution de PHP (nommée HHVM), qui améliore les performances du langage grâce à un système de compilation à la volée (JIT). Interpellés par ce projet, les développeurs de la communauté ont rapidement cherché à intégrer des améliorations similaires directement au sein de PHP. Regroupées sous le nom de PHPNG (pour PHP New Generation), ces optimisations ayant nécessité un important code refactoring ont préparé le terrain pour l’intégration d’un mécanisme de JIT tout en améliorant les performances globales du langage. En condition réelles, PHP 7 est près de deux fois plus rapide que PHP 5. Et si l’on se fie aux benchmarks réalisés par Rasmus Lerdorf (le créateur de PHP), PHP 7 atteignait en avril dernier le même niveau de performances que HHVM… dont les développeurs se sont, depuis, remis à l’ouvrage pour reconquérir leur avance !

Certains blogs ont vite assimilé la nouvelle version de PHP à PHPNG. En réalité, PHPNG, dont l’impact est loin d’être négligeable, ne représente qu’une partie du chantier réalisé.

Tests réalisés avec une l’offre d’Hébergement Web Performance 1 . Mesure du temps en seconde.

PHP 7 : De PHP 5 à PHP 7 : ça passe ou ça casse ?

L’arrivée de PHP 7 va conduire tout droit à la casse quelques fonctionnalités marquées comme « deprecated » depuis plusieurs versions. De nombreuses extensions non maintenues ont été supprimées , parmi lesquelles les extensions ereg_* et l’ extension mysql , à remplacer idéalement par l’extension PDO_mysql (mysqli est aussi disponible).

Si vous utilisiez des extensions non maintenues par PHP, telles que des connecteurs à des bases de données spécifiques, vérifiez bien leur support de PHP 7. PHPNG a modifié le fonctionnement interne des extensions. Celles-ci doivent être mises à jour pour fonctionner sous PHP 7, à l’instar du driver vers MongoDB pour lequel un prototype est d’ores et déjà disponible.

Toujours dans l’optique de l’amélioration des performances, PHP utilise maintenant un « abstract syntax tree » (AST) qui permet de réaliser des optimisations du code à la volée. Cependant, cela impose que la méthode de lecture du contenu soit uniforme. Avec PHP 5, le compilateur lit le plus souvent de gauche à droite, sauf dans quelques cas avec des variables lues de droite à gauche. Ces exceptions n’existent plus avec PHP 7 : tout le code est interprété de gauche à droite.

Prenons pour exemple la variable « $foo->$bar[‘baz’] ». En PHP 5, l’interprétation de cette variable pourrait s’écrire « $foo->{$bar[‘baz’]} », alors qu’en PHP 7, c’est d’abord $foo->$bar qui sera interprété. En PHP 7, l’interprétation pourrait s’écrire « ($foo->$bar)[‘baz’] ». Ce changement ne devrait pas avoir d’impact majeur pour vos applications, toutefois ne soyez pas étonnés si vous rencontrez des erreurs avec ce type de syntaxes.

Autre changement important, et c’est à mon sens une bonne nouvelle, les « fatals errors » retournées par le langage sont maintenant retournées dans des exceptions. Cela signifie que vous pouvez maintenant traiter ce type d’erreurs directement dans l’application, et éviter le comportement par défaut de PHP de se réaliser. Ceux qui ont eu affaire à ces erreurs savent de quoi je parle !

Enfin, le langage PHP comporte de nouveaux mots réservés. Attention donc, vous ne pouvez plus utiliser, pour nommer vos classes, namespaces ou traits, les mots suivants : int, foat, bool, string, true, false, null, resource, object, scalar, mixed, numeric. De nombreux frameworks PHP ont des wrappers autour de certains types de données comme les chaînes de caractères (string) et doivent s’adapter .

Les points évoqués ne représentent pas l’ensemble des cassures de comptabilité ascendante par rapport à PHP 5.6 mais celles qui sont, je crois, les plus importantes. La liste exhaustive est disponible sur le site de PHP (http://php.net/manual/en/migration70.php). Et, quand bien même vous auriez pris toutes les précautions, rien ne remplace un test en conditions réelles, sur votre infrastructure de préproduction, par exemple. D’ailleurs, si vous souhaitez rapidement tester votre application PHP, nos offres mutualisées vous permettent déjà de tester les versions bêta de PHP 7 !

Grâce au typage des paramètres scalaires, évitez l’erreur fatale !

La liste des nouvelles fonctionnalités de PHP 7 est longue. Et on y trouve de quoi combattre efficacement les personnes qui prétendent que PHP est dangereux à cause de son typage dynamique. Car, pour la première fois de son histoire, PHP intègre le typage statique des variables.

J’imagine déjà les réactions affolées de ceux qui songent à l’impact sur le code existant. Rassurez-vous, il s’agit de fonctionnalités facultatives, accessibles uniquement lorsque le typage strict est explicitement requis. J’imagine également ceux qui vont clamer que cela ne sert à rien. Ce n’est pas tout à fait vrai ! L’utilisation de variables statiques permet au compilateur PHP de réaliser des optimisations inenvisageables sans connaître à l’avance le typage de la variable. D’ailleurs, si vous cherchez la meilleure structure de données, il existe une excellente conférence de Patrick Allaert sur le sujet. Alors, quelles sont ces nouveautés autour du typage de données ?

Il s’agit en réalité de deux nouveautés : le « scalar type declarations » et le « return type declarations ». Pour le premier, il s’agit de la définition du type attendu dans les arguments d’une fonction. Si la valeur attendue par la fonction est correctement formatée, une exception est retournée par le langage. Par exemple, si vous devez définir une fonction permettant de diviser deux entiers, vous pouvez maintenant l’écrire ainsi comme dans l’exemple ci-dessous.

Code :

Résultat :

La fonctionnalité « return type declarations » permet de déclarer le format attendu en sortie de votre fonction. Comme précédemment, vous obtiendrez une exception si une mauvaise valeur est retournée par votre fonction.

Code :

Résultat :

Les puristes du typage statique diront que le fait du pouvoir fournir une chaîne de caractères contenant un entier devrait retourner une erreur et pourraient être déçus par ces nouvelles fonctionnalités… Mais, une fois encore, PHP 7 permet au développeur de définir son niveau de rigueur ! Ainsi, en ajoutant la ligne « declare(strict_types=1) ; » en début de fichier, PHP retournera une exception dans ces cas également. Cela fonctionne bien sûr pour le typage de retour d’une fonction, mais aussi pour celui de ces arguments !

Code :

Résultat :

Ces nouvelles fonctionnalités permettant au compilateur d’optimiser le fonctionnement du langage, il me semble dommage de passer à côté. Bien entendu, nul besoin de réécrire tout votre code pour passer en version 7 puisque le typage dynamique fait toujours bien partie de cette version. Et puis, il reste toujours quelques cas où son utilisation est bien pratique.
J’oubliais : PHP 7 supporte maintenant les caractères Unicode au sein des chaînes de caractères. Hérité du projet avorté de PHP6, cette nouveauté fait entrer PHP dans l’ère des petits 🐱

CMS et Frameworks : qui est déjà prêt ?

Beaucoup de développeurs utilisent des CMS ou des frameworks pour mieux se concentrer sur leurs problématiques métiers. Pour migrer vers PHP 7 et profiter des nouveautés décrites, il leur faudra attendre que ces frameworks soient mis à jour. Cela ne devrait pas tarder, car PHP 7 n’inclura pas de nouvelles fonctionnalités par rapport à la version bêta sortie début juillet, sur laquelle se sont basés les équipes qui maintiennent les principaux CMS et Frameworks.
Certaines équipes ont même annoncé être déjà prêtes à passer à PHP 7 ! On trouve parmi elles l’équipe de Symfony , prêt depuis août sur les versions 2.3, 2.6, 2.7 et la future 3.0, ainsi que l’équipe de Zend Framework , prêt depuis la version 2.4+, ou encore l’équipe de WordPress, compatible depuis la version 4.3 sortie en août.

Les autres sont dans les starting-blocks :
• Drupal intégrera le support de PHP 7 dans sa version 8, dont la sortie est imminente (la deuxième release candidate est sortie le 21 octobre ;
• Joomla ne supporte pas du tout PHP 7 dans sa version actuelle (merci la classe String ), mais la version 3.5 sera compatible ;
• PrestaShop n’a rien annoncé à propos du support de PHP 7, mais la version 1.6.1.2, dont la quatrième release candidate est sortie ces derniers jours s’installe correctement avec PHP7.

L’année 2015 constituera probablement un tournant pour le langage PHP, puisque les gains de performances apportés avec la version 7 lui permettent de concurrencer de nombreux langages sur le terrain de la vitesse. PHP 7 intègre aussi des fonctionnalités attendues par de nombreux développeurs. Mais, contrairement à la migration de PHP 4 vers PHP 5, les cassures dans le langage ne sont pas très impactantes et la migration ne nécessite pas de revoir vos applications de A à Z ! Alors, c’est peut-être déjà le moment d’envisager vos migrations…

Tech lead on OVH hosting and for some cakes.