De PHP 5 à PHP 7, une industrialisation logique
Une fois n’est pas coutume, cet article est relativement technique, il concerne l’évolution de la technologie PHP grâce à laquelle la majorité des applications Web fonctionnent. Pour les moins experts d’entre vous, en quelque mots, PHP est à la fois un langage de programmation Web et une plateforme sur laquelle on pose des briques logicielles (Outils de gestion de contenu, Framework, CRM…).
Je profite d’avoir initié, avec Pascal Martin et Julien Pauli, la refonte de mon livre « PHP 5 avancé » vers « PHP 7 avancé » et du travail de préparation de la formation PHP 7 pour Openska pour faire un point rapide sur cette nouvelle version.
PHP a vingt ans et a évolué avec le Web. Quand, en l’an 2000, développer un site Web ne nécessitait qu’un nombre limité de compétences, en 2016 on développe des applications bien plus complexes et le spectre des spécialisations nécessaires pour y arriver s’est fortement élargi. En parallèle les développeurs PHP ont eu besoin de plus en plus d’outils pour être en mesure de développer des programmes de plus en plus complexes et ambitieux.
Cette année, PHP s’est offert une petite cure de jouvence : une septième version majeure (ou plutôt une sixième du fait de l’abandon de PHP 6).
Les changements par rapport à PHP 5 sont importants, il ne s’agit pas d’une simple mise à jour mais d’une refonte importante du moteur. Au menu des principales nouveautés on peut trouver :
- Nouvelle version du Zend Engine
- Gestion des erreurs
- Typage scalaires et return type
- Différentes modifications destinées à améliorer la cohérence du langage
Nous allons faire un tour des nouveautés de PHP 7 avec quelques exemples pour illustrer notre propos.
Rapide historique
Depuis PHP 5, on voit clairement une évolution allant vers plus d’industrialisation pour compléter une base solide :
- PHP 5.1 renforce l’accès aux bases de données avec PDO,
- PHP 5.2 supporte JSON,
- PHP 5.3 apporte les namespaces et les fonctions anonymes,
- PHP 5.4 implémente les Traits,
- PHP 5.5 complète les itérateurs avec les générateurs, tellement plus simples à utiliser, et introduit un cache d'opcodes.
L’histoire de PHP 6 a été plus compliquée, avec notamment des grosses difficultés à implémenter le support complet d’Unicode. Longtemps attendue, toujours retardée et enfin abandonnée, cette sixième version majeure a finalement été remplacée par PHP 7 pour des raisons de cohérence (beaucoup de choses étaient annoncées sur PHP 6 depuis des années, des livres étaient même sortis sur le sujet…). Dans la pratique, une partie importante des améliorations qui auraient dues être intégrées sur PHP 6 l’ont été sur PHP 5.
Nouvelle version du Zend Engine
Un des apports de PHP 7 réside dans l’optimisation des performances. Selon les applications, on constatera une amélioration de celles-ci qui peut aller de 30% jusqu’à 100%.
Pour atteindre ce résultat, il a été nécessaire de retravailler en profondeur certaines parties du moteur interne de PHP, qui monte lui-même également de version : on parle désormais du Zend Engine 3.
Gestion des erreurs
En PHP 5, une partie des erreurs fatales n'étaient pas interceptables par le mécanisme des exceptions. Cela posait parfois quelques problèmes ou du moins montrait ses limites lors des réflexions sur l’architecture de projets. Une des principales problématiques était liée à la tendance de PHP à lever des erreurs (particulièrement dans le cas d’erreurs fatales) qui mettaient fin à l’exécution du script. Dans certains cas où il est nécessaire que le script s’exécute longtemps (comme, par exemple, quand on code un démon) cela posait problème. C’est pour cela que PHP 7 a fait évoluer sa gestion des erreurs : une grande partie des erreurs fatales de PHP sont maintenant traitées en tant qu’exception, il est donc possible de les intercepter et de les traiter.
Prenons un exemple générant une erreur qui en PHP 5 aurait arrêté votre script sans vous laisser l’opportunité de l’intercepter : l’appel d’une méthode sur ce qui aurait dû être une instance de classe mais qui n’est en fait rien, qui vaut null.
<?php
$obj = null;
try {
$obj->methode();
}
catch (Error $e) {
// string(43) "Call to a member function methode() on null"
var_dump($e->getMessage());
}
?>
Cette nouveauté apporte plus de souplesse dans la gestion des erreurs de PHP et permet surtout d’intercepter la grande majorité des erreurs fatales.
Évolution du typage
PHP est connu pour être un langage de typage souple : vous n’avez pas besoin de préciser le type d’une variable, PHP s’en charge automatiquement. D’un côté, c’est une force, car cela permet plus de souplesse mais, d’un autre coté, c’est une source potentielle de problèmes, quand vous ne pouvez pas spécifier ce que vous souhaitez recevoir comme données.
PHP 7 élargit le spectre défini pour PHP 5 : il est désormais possible de typer les paramètres des fonctions et des méthodes.
<?php
function add(int $a, int $b) {
return $a + $b;
}
var_dump( add(10, 20) ); // int(30)
Il est également possible de définir également le type de retour d’une fonction. Par exemple, ici, pour une fonction censée retourner un nombre flottant (et qui en l’occurrence ne fonctionnera pas):
<?php
function test() : float {
return 'bonjour';
}
?>
Par défaut PHP tentera de convertir les données qui lui ont été transmises, pour respecter le typage demandé. Si vous ne le souhaitez pas et vous voulez que PHP travaille en mode de typage plus strict, une nouvelle option est disponible pour l’instruction declare() :
<?php
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
add(10, '20');
Autres améliorations de PHP 7
PHP 7 a été l’occasion de travailler à l’amélioration de la cohérence générale. Plusieurs modifications attendues ont été intégrées :
- PHP 7 ne supporte plus les balises d’ouvertures alternatives telles que <% ou <%=
- PHP 7 ne permet plus d’avoir plusieurs cas default dans un switch.
- Utiliser des constructeurs de classe à la façon PHP 4, où le constructeur est une méthode de même nom que la classe, lèvera désormais un avertissement indiquant qu’ils sont obsolètes.
Finalement, la révolution de PHP ce n’est pas que PHP 7 mais les évolutions qui sont faites au fil des années. En tout cas c’est ce que nous mettons en avant dans « PHP 7 avancé » et c’est ce que nous cherchons à transmettre quand nous réalisons la formation PHP 7 qui reprend les nouveautés depuis PHP 5.5.
Pour information la prochaine formation PHP 7 sera animée par Pascal et moi-même les 7 et 8 Mars. Il n’est pas certain que nous ayons le temps d’en faire beaucoup cette année, alors ne perdrez pas cette occasion de venir échanger avec nous.