Ce que vous devez savoir sur PHP7 concrètement
PHP7 ça fait un moment qu’on en parle, on en voit par petite bribe un peu partout. Et là on y est presque, la première release stable est à deux doigts d’être sortie (jeudi 3 décembre) ! Il est donc grand temps de s’y préparer. Ou alors de se remettre dans le bain pour ceux qui se sont déjà renseignés. Alors ? Quoi de neuf ? Quels sont les changements ? Et niveau performance ça donne quoi ? Allez on fait un tour du propriétaire.
So ? Quoi de neuf ?
La fête aux namespaces
// Pre PHP 7 code use foo\bar\ClassA; use foo\bar\ClassB; use foo\bar\ClassC as C; use function foo\bar\FunctionA; use function foo\bar\FunctionB; use const foo\bar\ConstA; use const foo\bar\ConstB; // PHP 7+ code use foo\bar\{ClassA, ClassB, ClassC as C}; use function foo\bar\{fn_a, fn_b, fn_c}; use const foo\bar\{ConstA, ConstB, ConstC};
Il peut nous arriver de devoir faire un paquet d’appels d’autres classes, fonctions et/ou constantes pour nos classes. Avec PHP7 on peut utiliser les accolades dans le use(!!) et les inclusions se feront pour chaque classe dans l’accolade ! C’est toujours sympa comme ajout ! Ça a le mérite de grouper en une seule ligne tous nos appels, c’est plus clair et plus efficace. Même si, on est d’accord, on s’arrange pour ne pas avoir besoin de beaucoup d’inclusions dans un seul fichier, notamment avec une meilleure séparation des responsabilités.
Spaceship operator
// Pre PHP 7 code ($a < $b) ? -1 : (($a > $b) ? 1 : 0) // PHP 7+ code $a <=> $b
On a le droit à un nouvel opérateur de comparaison ! Cet opérateur ne vous retournera que les valeurs suivantes : -1, 0 ou 1. Elles ne seront retournées qu’en respectant les comparaissons suivantes : $a est plus petit que, égal à ou plus grand que $b. Un exemple vaut mieux qu’un long discours jeter un oeil au code suivant.
echo 1 <=> 1; // affiche 0 ==> 1 est égal à 1 echo 1 <=> 2; // affiche -1 ==> 1 est plus petit que 2 echo 2 <=> 1; // affiche 1 ==> 2 est plus grand que 1
À noter que ces comparaisons fonctionnent de la même manière avec les floats, strings, array ou même les objets. Tout cela va nous être utile pour certaines fonctions de tri et pour tout simplement avoir un code plus simple et plus rapidement compréhensible par tout le monde.
Null coalesce operator
// Pre PHP 7 code $a = isset($b) ? $b : "default"; // PHP 7+ code $a = $b ?? "default";
L’exemple parle de lui-même. En PHP la façon la plus simple de vérifier si une valeur existe, et donc si on peut l’afficher, est la première syntaxe dans le code ci-dessus. Hors cette façon de faire est un peu lourde et comme dans les exemples précédents le but de cette nouvelle syntaxe est de réduire la verbosité (c’est toujours largement meilleur d’avoir moins de code) et de faciliter la lecture et la compréhension du code. En plus avec cette nouvelle syntaxe on peut très facilement chaîner nos tests !
$a = NULL; $b = NULL; $c = 1; var_dump($a ?? $b ?? $c); // affiche 1
Scalar type declarations
Il s’agit de nouvelles façons de typer des paramètres pour nos fonctions. En PHP on connait déjà le typage par classe, interface, tableau ou callback. PHP7 rajoute le typage par chaîne de caractères, entier, flottant et boolean. Ce changement a déjà pour avantage sympa de faire taire (un petit peu) tous les trolls qui disent que PHP « c’est pourri et surtout dangereux à cause du typage dynamique » car on y intègre du typage statique de variable. Et ça c’est le bien. C’est le bien aussi parce que ça nous permet à nous de faire moins de test sur nos variables et surtout de récupérer de la levée d’exception en cas de mauvais typage.
function foo(int $foo, int $bar) { echo $foo + $bar; } var_dump(foo(1, 1)); // affiche 2 var_dump(foo(1, '1')); // affiche 2 var_dump(foo('a', 1)); // Grosse erreur Uncaught TypeError
Hé mais dans le deuxième var dump on balance un string et PHP7 bronche pas ? Non. Tout simplement parce que ‘1’ peut être casté en integer et donc il le fait automatiquement. Ceci dit, on peut forcer PHP à être strict pour son typage et prendre donc en compte ce genre de cas.
declare(strict_types=1); function foo(int $foo, int $bar) { echo $foo + $bar; } var_dump(foo(1, 1)); // affiche 2 var_dump(foo(1, '1')); // Grosse erreur Uncaught TypeError
Return type declarations
On continue sur le typage avec cette fois le typage du retour d’une fonction ! On peut désormais typer le type de variable retourné par une fonction en PHP7. Le typage de variable de retour est disponible pour tous les types de déclarations de variable juste avant. Et d’ailleurs les avantages sont les mêmes, plus de typages, plus de cadrages de nos entrées et sorties et donc plus de contrôle sur les erreurs et le fonctionnement global de notre programme.
function getRandInteger(int $max) : int { return mt_rand(1, $max); } $randInteger = getRandInteger(100); echo $randInteger; // affiche un integer entre 1 et 100
Les classes anonymes
Dans un précédent billet, je faisais une parenthèse sur les fonctions anonymes(ou closures) et leur utilisation. Et bien PHP7 nous offre le même type de fonctionnement mais avec les classes !!
Dans beaucoup d’autres langages c’est un vieux concept, par exemple les JAVA-ist et les C#-ist (oui j’invente des mots) ont l’habitude et depuis longtemps de ce genre de fonctionnement, mais en PHP c’est nouveau !
Une classe anonyme est une classe sans nom. Alors ça change pas le fonctionnement de la classe en elle-même, ni même sa syntaxe, à part bien évidement qu’on ne met pas le nom.
$foo = new class { public function displayName() { echo "Je suis anonyme"; } }; $foo->displayName(); // affiche "Je suis anonyme"
On peut utiliser ce genre de choses par exemple quand une classe n’a pas besoin de documentation et/ou quand une classe est exécutée une seule fois, c’est également au niveau des tests qu’on l’utilisera notamment pour la possibilité d’implémenter des interfaces à la volée et l’utilisation ultra simplifiée des mocks.
Et oui ! Comme ces classes fonctionnent comme les autres on peut donc les étendre, leur implémenter une interface ou encore leur faire utiliser un trait !
$foo = new class("Hello") extends fooClass implements fooInterface { public $bar; public function __construct($message) { $this->bar = $message . " World !"; } use fooTrait; } var_dump($foo->bar); // affiche "Hello World !"
“Rien n’est permanent, sauf le changement.”
La fatal gestion des erreurs
PHP7 va changer la manière dont la plupart des erreurs, et quand je dis erreurs je parle des « Fatal errors », vont seront renvoyées. Avant PHP7 la gestion des fatals errors était compliquée, car si dans le cas d’une levée d’exception il suffit de faire un try-catch pour les récupérer et continuer l’air de rien le process, les fatals errors en ont rien à faire de votre try-catch. La fatal error elle s’en fout, elle plante et elle viande avec elle tout votre projet avec un bon gros halt script des familles. Bref aucun respect pour votre boulot !
Vous savez ce moment où vous allez sur la page de votre projet et que vous tombez sur une page blanche et que pendant ce temps là les logs sont en train de vous insulter? C’est fini tout ça !
Et oui PHP7 va aussi lever une exception pour ce type d’erreurs et votre catch va pouvoir s’en occuper. Alors petit bémol, c’est pas le cas pour absolument toutes les fatals errors. Par exemple ça marche pas pour la fameuse erreur « Out of memory ». Si vous faites n’importe quoi avec votre mémoire ça va lamentablement planter aussi en PHP7.
Et pourquoi ca s’appelle pas PHP6 ?
5 +1 = 6
Maintenant que j’ai prouvé mes talents en math on peut se demander pourquoi les créateurs et la communauté de PHP ne sont pas arrivés au même résultat que moi ? C’est pas le calcul le plus dur de la terre et ces mecs-là sont quand même des tronches !
Alors il faut savoir que PHP6 a bien été en développement mais que des mauvais choix techniques à la base avait avorté le développement car il devenait un énorme casse-tête. Quelque temps plus tard, le développement d’une nouvelle version majeure reprit alors et l’une des premières questions était le nom. Les mecs de PHP ont donc fait un RFC pour demander si on passait bien par PHP6 ou si on allait directement à PHP7. Résultat la majorité a choisi la version 7. Mais pourquoi cette question et pourquoi cette réponse ?
D’une part car même si le premier développement de PHP6 a été avorté et bien ce développement a été suivi et documenté. Notamment dans des livres dans le commerce et plein de ressources partout sur internet. Et comme ce qu’ils allaient développer était différent la confusion était simple et rapide entre les ressources. Et ça aurait été le gros bordel !
Une autre raison est que la version 6 dans le monde de le programmation informatique et logiciel est perçue comme une version vouée à l’échec. Perl6 a été un échec. Windows Vista est la version 6 de Windows, PHP6 lui-même a été un échec et dois-je parler d’Internet Explorer 6 ?
Pardon ? Java 6 ? Heu… L’exception qui confirme la règle ?
HHVM et PHP7 sont dans un bateau
Pour ceux qui se demandent ce qu’est HHVM : HipHop Virtual Machine est comme son nom l’indique une machine virtuelle créée par Facebook et qui permet d’optimiser le développement, le débogage et l’exécution de code PHP ou Hack. HHVM utilise une compilation JIT (Just in time) pour envoyer du lourd côté performance.
À une certaine époque HHVM impressionnait la communauté PHP par les performances qu’il proposait via le PHP. Les premiers benchmarks étaient impressionnants de rapidité ! Puis PHP7 est arrivé avec lui aussi son gros benchmark et les taux se sont resserrés ! Aujourd’hui concrètement PHP7 est deux fois plus rapide que PHP5.6 ! Ce qui équivaut à peu près au performances de HHVM avec toute de même un avantage à PHP7. Et ça c’est une super nouvelle. Jetez donc un œil à cette infographie sur le site officiel de Zend. D’après les développeurs de PHP7 le gain de performances vient surtout du faite d’un énorme refactoring !
Épilogue
Si tu veux en savoir plus sur PHP7, je te conseille fortement ce bouquin ! PHP7 c’est que des bonnes choses alors si vous avez jamais installé une version RC : installez donc la première version stable qui sort jeudi et amusez-vous un coup avec. En plus d’être le bien cette nouvelle version majeure c’est aussi ce sur quoi vous travaillerez demain (si vous êtes un développeur PHP évidemment). Ça fait 10 ans qu’on l’attend cette nouvelle version majeure vous allez pas la bouder quand même ?
Merci pour l’article, très bon résumé de l’essentiel de PHP7 !
Super article, petite coquille PHP 7 est plus rapide que HHVM (cf image ;), on voit bien hhvm en dernier à la traine derrière PHP 7 sur un benchmark drupal)
Ce qui est vrai pour Drupal ne l’est pas forcément pour wordpress par exemple :
https://kinsta.com/blog/hhvm-vs-php-7/
http://talks.php.net/fluent15#/wpbench
C’est vrai 🙂
WordPress on s’en fou c’est de la merde
Dans ce cas 25% du web est de la merde 😉
C’est un peu le cas non ?
Je pense qu’on est même loin du compte ^^
Effectivement, j’avais même failli éditer ma réponse pour dire ça haha
J’avoue que j’ai pas été clair dans ma phrase mais oui PHP7 est plus rapide dans la plupart des cas !
Bon résumé !
En revanche, IE6 n’a pas été un échec, loin de là. Quand il est sorti, il n’était pas mauvais, et le succès de XP avec lequel il était livré l’a propulsé à travers les années. Il nous paraît donc obsolète aujourd’hui, mais à l’époque c’était pas mal.
Sinon je crois que HHVM est souvent plus rapide que PHP7 sur du gros calcul, de l’algo pure, le JiT aidant beaucoup pour ça. PHP7 est en revanche effectivement souvent meilleur sur les applications real-life (parce que c’est quand-même rare de faire du calcul intensif en PHP, d’où l’impact limité du JiT dans un langage web où les I/O représentent la majeure partie du programme…). HHVM veulent contre-attaquer en intégrant un compilo JiT beaucoup plus puissant à HHVM, et Zend travaillent déjà à ajouter du JiT au Zend Engine pour pas se laisser re-distancer (ils ont fait une branche expérimentale pour ça et ont publié des benchs… grave impressionnants). Avec un peu de chances on verra ça dans le ZE 4 ^^
Et attention aux infographies de Zend aussi, ils prennent les chiffres qui les arrangent…