PHP 8 : nouvelles fonctionnalités et compatibilités


Publié le 06-01-2021 par Modérateur FREELANCE INFO



PHP 8 est officiellement disponible depuis le 26 novembre 2020. Il s’agit d’une évolution majeure du célèbre langage de programmation. Selon l’entreprise W3Techs, spécialiste dans la collecte de données sur le web, PHP reste le langage le plus utilisé. En effet, il est présent dans près de 80 % des sites internet. Beaucoup de contenus sont donc concernés par la mise à jour. De plus, avec l’arrivée de ces évolutions importantes, des modifications de codes existants risquent d’être nécessaires. Découvrez, en détail, les nouvelles fonctionnalités de PHP 8 ainsi que sa compatibilité avec les versions antérieures.

PHP 8 quelles nouvelles fonctionnalités ?

En tant que variante majeure, PHP 8 comporte une grande quantité d'innovations. Voici les principales, classées par thèmes.

Apparition de nouveaux opérateurs

PHP 8 marque l’apparition d’un nouvel opérateur de comparaison « match ». Celui-ci fonctionne de manière identique à « switch », mais inclut 3 avantages :

  • son résultat peut être stocké dans une variable, et donc être directement retourné,

  • il ne nécessite pas l’emploi de « break »,

  • « match » permet de faire des comparaisons strictes, c’est-à-dire qu’il compare à la fois la valeur et le type des éléments.

Concrètement, là où « switch » demande une syntaxe comme celle-ci :

<?php

switch ($id) {

                  case 1:

                  case 2 :

                                    $message = null ;

                                    break ;

                  case 3 :

                                    $message = 'L\'identifiant est 3';

                                    break ;

                  case 4 :

                                    $message = 'L\'identifiant est 4';

                                    break ;

                  default :

                                    $message = 'Identifiant inconnu';

                                    break ;

}

?>

L’équivalent est beaucoup plus simple avec « match » :

<?php

$message = match ($id) {

                  1, 2 => null,

                  3 => 'L\'identifiant est 3',

                  4 => 'L\'identifiant est 4',

                  default => 'Identifiant inconnu',

};

?>

Un autre opérateur, très attendu, est ajouté à PHP 8. Il s'agit de « nullSafe ». Avec lui, il devient beaucoup plus simple de contrôler que tous les composants d’une chaîne ne sont pas nuls.

Par exemple, pour récupérer l’identifiant d’un utilisateur connecté en vérifiant que ces données ne sont pas vides, il est possible en PHP 8 d’écrire une seule instruction :

<?php

$identifiant = $session ? -> utilisateur ? -> getLogin ( ) ? -> identifiant;

?>

Pour comparaison, en PHP 7 il aurait fallu écrire :

<?php

if ($session !== null) {

                  $utilisateur= $session→utilisateur;

 

    if ($utilisateur !== null) {

        $login = $user→getLogin();

        if ($login !==  null) {

            $identifiant = $login->identifiant;

        }

    }

}

?>

Ajout de nouvelles fonctions et types de variables

De nouvelles fonctionnalités plébiscitées par les développeurs font leur apparition dans PHP 8 :

La fonction str_contains () vient remplacer « strpos() ». Plus simple d’utilisation, elle permet de vérifier rapidement qu’une chaîne de caractère est contenue dans une autre. Par exemple, il est désormais possible d’écrire :

if (str_contains [« phrase comportant beaucoup de termes ! », « termes »]) {}.

Deux fonctions supplémentaires concernant les chaînes de caractère « str_starts_with () » et « str_ends_with () » font aussi leur apparition. Elles contrôlent qu’une phrase commence ou se termine par des lettres ou mots spécifiques.

La fonction « get_debug_type () » permet, quant à elle, de renvoyer un message d’erreur plus complet que sa prédécesseure « gettype() ». Elle peut notamment retourner le nom d’une classe ou des informations sur les paramètres d’un tableau.

Enfin, PHP 8 dispose d’un tout nouveau type de variable : « mixed ». Comme son nom l’indique, il permet de préciser qu’une variable est capable de recevoir plusieurs types : « bool », « int » ou « float », « string », « object », « callable », « resource », ou encore « array ».

Une variable de type « mixed » accepte également la valeur « null ». Enfin « mixed » peut aussi être utilisé comme paramètre ou type de retour d’une fonction.

L’arrivée du compilateur JIT (Just In Time)

Le compilateur JIT ou « compilation à la volée » en français promet un fort gain de performance. En effet, PHP est un langage interprété c’est-à-dire qu’il est traduit en code machine au moment de l’exécution. Ce fonctionnement peut entraîner une perte de ressources CPU et donc un délai supplémentaire.

Le « JIT » permet de compiler certaines parties du code au moment de l’exécution, afin que celui-ci  soit utilisé à la place du code à traduire.

Cette version peut être considérée comme « en cache », ce qui réduit le temps d’exécution puisque le code contenu est déjà interprété.

En réalité, ce sont deux nouveaux compilateurs qui font leur apparition : function JIT et tracing JIT.

Tracing JIT est le plus performant des deux ; lors de tests, les performances d’exécution ont pu être multipliées par 4. Cependant ces améliorations  restent très inégales selon les applications web et la quantité de code à traiter.

Pour Wordpress par exemple, le gain de performance avec le tracing JIT est de 1,05 tandis qu’il est de 2,98 pour Mandelbrot (une classe utilisant des mathématiques de précision arbitraire).

scheme.svg

Le JIT est globalement plus efficace pour les applications à longue durée d’exécution. Vous pouvez retrouver les résultats complets des tests sur le graphique « Contribution relative du JIT à la performance de PHP 8 », du site officiel de PHP.

PHP 8 optimisation et rétrocompatibilité

En plus de l’ajout de nouvelles fonctionnalités, PHP 8 intègre l’optimisation de paramètres et comparateurs existants.

Amélioration de la gestion des chaînes de caractère et des nombres

En PHP 7, la comparaison large entre un mot (ou une phrase) et un numérique pouvait retourner le résultat erroné « True ». Désormais, PHP 8 instaure un contrôle de type plus strict.
Ainsi la ligne 0 == « exemple » renverra bien « False ».

Une autre amélioration concerne la conversion des nombres flottants en chaînes de caractères. Auparavant, lors de cette conversion, les chiffres après la virgule étaient tronqués. En PHP 8 le nombre est bien « transtypé » dans son intégralité.

Simplification des attributs et de la syntaxe

Les attributs sont une autre nouveauté très attendue de PHP 8. En effet, jusqu’ici les développeurs devaient utiliser le format PHPDoc pour documenter leurs fonctions. Il fallait donc installer l’application de documentation et connaître une liste de tags.

Aujourd’hui, les attributs en PHP 8 correspondent aux annotations en Java, C# et C++ ou encore Rust. Ils permettent d’ajouter des données structurées aux déclarations de classes, fonctions, paramètres, constantes, etc. en employant la syntaxe native de PHP.

Voici un exemple d’attribut en PHP 7 :

<?php

/**

 * @ORM\Column(type="string", length=150, nullable=false, name="nom_utilisateur")

 */

private $UsersName

?>

et sa nouvelle syntaxe native en  PHP 8

<?php

<<ORM\Column("string", 150, false, "nom_utilisateur")>>

private $nomUtilisateur;

?>

La définition des constructeurs se trouve également simplifiée. À présent, les propriétés de la classe peuvent être déclarées, initialisées et rendues accessibles en une seule ligne. Ainsi, en tapant le mot « public » devant un argument de la classe, PHP crée automatiquement une propriété publique correspondante.

Rétrocompatibilité avec PHP 7

Ces différentes améliorations et simplifications risquent d’occasionner des problèmes de rétrocompatibilité. L’ensemble des impacts sont listés sur le site officiel de PHP, mais voici les principaux éléments à prendre en compte :

  • Le terme « Match » devient un opérateur et donc un mot clé réservé.

  • Le constructeur ne doit plus porter le nom de la classe, mais utiliser systématiquement la méthode « __construct() ».

  • La fonction « create_function [] » n’existe plus, elle peut-être remplacée par une fonction anonyme.

  • L’utilisation de « parent [] » dans une classe n’en ayant pas entraîne désormais une erreur fatale.

  • L’opérateur @ ne permet plus de masquer les erreurs fatales, pour éviter tout problème en production lors de la mise à jour, vous pouvez paramétrer le serveur avec « display_errors = Off » afin de ne pas afficher les messages d’erreurs.

  • L’appel à une constante non définie entraîne à présent une « error Exception ».

  • La fonction « each () » est également supprimée, il reste possible d’utiliser « foreach » ou une boucle itérative.

  • Désormais, toutes les erreurs y compris « E_NOTICE » et « E_DEPRECATED » sont remontées par défaut. Le booléen « display_startup_errors »est  aussi désormais activé par défaut.

Voici pour ce tour des nouveautés de PHP 8 et des potentiels problèmes de compatibilité. Avez-vous installé la mise à jour ? Quelles nouveautés attendiez-vous particulièrement ? N’hésitez pas à nous faire part de vos impressions sur PHP 8 sur le forum !



Modérateur FREELANCE INFO