[Be-Zend 2015] Quoi de neuf chez PHP ?

<?php

namespace PHP7\{ NewFeatures, Break, Performances }

echo « Bonjour à tous ! 🙂 »;

?>

Vous l’aurez sûrement compris, aujourd’hui on parle de PHP et plus spécifiquement de la conférence réalisée par Julien Pauli (SensioLabs), lors de la 8ème édition de Be-zend, intitulée Quoi de neuf dans le dépôt ? Durant 45 minutes, nous avons pu assister à un bilan des dernières évolutions de PHP 7. Je vais décrire les différents éléments évoqués dans la suite de cet article.

  1. Historique des versions
  2. Les ajouts
  3. Les évolutions
  4. Les cassures entre PHP 5 et 7

Historique des versions

La conférence a commencé par un bref rappel des évolutions de PHP en soulevant que sa dernière version majeure (la 5) a vu le jour il y a plus de 10 ans. Il était donc justifié de passer à une nouvelle itération pour pouvoir faire évoluer le langage en se permettant de casser des choses. Ainsi la version 7 a vu le jour. Nous avons également eu l’explication de: Pourquoi directement la 7 et non pas la 6 ? La raison est simple: la version 6 était en cours mais trop d’idées ont été débattues et n’ont pas été conservées. De ce fait, cette version a été abandonné et la 7 a vu le jour pour éviter tout mal entendus.

Les ajouts

De nouvelles fonctionnalités vont apparaître avec PHP7:

  • null coalescing operator:
    On connaissait déjà la syntaxe: $a = isset($a) ? $a : null;
    A présent, il sera possible de faire ceci: $a = $a ?? null; Voir même de les chaîner comme ceci: $a = $a ?? $b ?? null;
    Pour plus d’informations: http://en.wikipedia.org/wiki/Null_coalescing_operator#.3F.3F_operator
  • spaceship (<=>):
    Un nouvel opérateur de comparaison vient s’ajouter à la longue liste déjà présentes (<, <=, ==, etc). Nommé spaceship du à sa forme qui ressemble à un vaisseau. Au lieu de juste retourner un boolean, celui-ci renvoie l’une de ces trois valeurs: -1, 0, 1. Voici un petit exemple issue de la rfc:
    echo 1 <=> 1; // 0
    echo 1 <=> 2; // -1
    echo 2 <=> 1; // 1
    Pour plus d’informations, vous pouvez vous rendre sur la rfc concernant ce nouvel opérateur.
  • La suppression des fatal error en les remplaçant par de nouvelles exceptions PHP. Ceci a pour but de pouvoir mieux gérer les erreurs en production pour les utilisateurs. Ainsi a vu le jour EngineException et ParseException qui n’héritent pas de la classe Exception pour éviter des try/catch trop larges et également garder le même comportement pour les codes issues de PHP5. Il est bon de préciser qu’aucun retour en arrière ne sera possible, une fois PHP7 sortit, les fatal error seront de l’ancien temps. Il est sous entendu que les fonctions natives de PHP seront sujettes à ce changement même si le travail d’adaptation est encore en cours.
  • La classe Closure se voit doter d’une nouvelle méthode statique nommée call(object $to[, mixed …$parameters]) et qui permet d’exécuter une fonction anonyme dans le contexte d’un objet (le premier paramètre). Pour plus d’informations, vous pouvez consulter la rfc sur cette méthode.
  • Une des grandes annonces, c’est le retour typé des fonctions ainsi que le typage de ses paramètres (pour les scalaires, cela était déjà possible avec les objets). Il est bon de préciser que ces nouvelles options sont facultatives et que rien ne vous oblige à les utiliser. Comme dans le cas des fatal error, les fonctions natives de PHP vont être mises à jour pour utiliser ces nouvelles options. Un petit exemple de cette nouvelle syntaxe:
    Il est bon de noter que dans le cas d’une interface, le type mentionné pour le retour d’une méthode fait partit intégrante de la signature et ne peut donc pas être changé lors de son implémentation. De plus, il a été ajouté la déclaration declare(strict_types=1) qui permet d’empêcher le cast automatique des paramètres/retour (sans pour autant obliger l’utilisation du typage pour chaque éléments). Il doit être placé en tout début du fichier et ne concerne que le fichier en cours. Ainsi, le code précédent devient ceci:
    Pour plus d’informations, la rfc sur les retours typés.

Les évolutions

Avec l’arrivée de PHP7, des modifications vont également avoir lieu sur l’existant:

  • Une modification sur l’utilisation des namespaces permettra d’en déclarer plusieurs depuis un seul use (pour plus d’information, la rfc officielle). Ainsi, il sera possible d’écrire ceci:
  • Une refonte des assertions a eu lieu pour faciliter leurs utilisations et les rendre plus performantes.
  • Les sessions ont été réécrites en majeure partie. Ainsi, il a été inclus les
    • lazy writes qui ne flush la nouvelle session que si elle a été modifiée et non plus dès qu’elle est ouverte.
    • read only qui permet d’empêcher l’écriture dans la session. Si une écriture est tentée, une exception est levée.
  • Le moteur a été retravaillé et permet à présent de prendre pleinement en charge les OS sous 64bits et possède un nouveau memory manager.
  • Le parser a été complètement réécrit en se basant sur l’AST (page rfc).

Ces différentes évolutions ont permit un gain de 30% (selon le zend bench). Julien Pauli a réalisé un bench sur les tests PHPUnit de doctrine 2 entre PHP 5.6 et PHP 7, dont voici les résultats:

  • Le temps d’exécution passe de 24.48 secondes à 12.87 secondes: gains de 50%.
  • La mémoire consommée passe de 341.75Mb à 132Mb: gains de 61%.

Les cassures entre PHP 5 et 7

Mais tous ces bénéfices ne sont pas sans conséquences. Comme toutes versions majeures, quelques soucis de compatibilités sont à prévoir:

  • Les chaînes débutant par 0x ne seront plus interprétées comme des entiers.
  • $this dans un contexte statique ne sera plus interprété et vaudra NULL.
  • Apache1 ne sera plus supporté.
  • Même si cela peut sembler étrange comme fonctionnement, il était possible en PHP5 de mettre dans une fonction des paramètres de même noms (function foo($a, $b, $a)). Ceci ne sera plus possible.
  • Certains noms de classes/namespace seront réservés (pour une utilisation future possible). Plus d’informations sur la RFC.

Pour conclure, quelques informations sur le futur de PHP7 et de PHP en règle générale. Premièrement, les versions alpha et beta devraient être lancées cet été pour une release prévue en fin d’année 2015. Les futurs évolutions devraient être plus rapide (une version par an au moins) et la prochaine version majeure devrait arriver bien avant une dizaine d’année. Suite à une question du public, on a appris également qu’aucun parser d’annotations n’était prévu pour la version 7 mais qu’il serait possible de le voir apparaître dans une version 7.1 ou 7.2 en fonction de la demande. Au sujet de Symfony, la version 3 sera axée sur la version 5.5 de PHP. Pour PHP7, on table plutôt sur une version 4 de Symfony (au mieux) qui sera optimisée pour ces nouvelles fonctionnalités. Vous pouvez retrouver toutes les RFC concernant PHP7 à cette adresse: https://wiki.php.net/rfc#php_70. Julien Pauli invite les développeurs à expérimenter cette version 7 et à faire leurs retours sur d’éventuels bugs rencontrés. N’hésitez pas à laisser un commentaire si vous soulevez une erreur dans cet article ou si vous avez des questions.

PS: Si les slides de la conférence sont rendus publics, je rajouterai le lien dans cette conclusion.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *