Découvrez les nouveautés de PHP 8

La nouvelle version majeure du langage apporte de nombreux éléments.

Certains viennent offrir de nouvelles fonctionnalités, tandis que d’autres, vont améliorer l’expérience actuelle. 

La version définitive de PHP 8 devrait être publiée vers la fin de l’année (26 novembre 2020).

Toutefois, Il est possible de tester la nouvelle version de PHP en version bêta, et ce, depuis le 01 octobre 2020 (lien ci-dessous).

https://github.com/devilbox/docker-php-fpm-8.0 )

Voici un éventail des différentes nouveautés relatives à PHP 8.

 

Compilateur JIT :

L’introduction d’un compilateur JIT dans PHP 8 a été proposé en avril 2019.

JIT est une technique qui permet de compiler des parties du code au moment de l’exécution, de sorte à ce que la version compilée puisse être utilisée à la place.

Le but est d’améliorer les performances du langage en matière de vitesse et ainsi engendrer un gain de performance.

Un test réalisé en début d’année 2020 consistait à exécuter cents fois un script php simple.

Les développeurs de PHP sont arrivés aux résultats suivants : 

Version de Php Moyenne des temps en secondes
5.3 0.64574003219604
7.4 0.10253500938416
8 ( sans JIT ) 0.098223924636841
8 ( avec JIT ) 0.053637981414795

 

L’extension JSON toujours active :

Dans les anciennes versions de PHP, l’extension JSON pouvait être désactivée de manière optionnelle. 

JSON étant un format de données très important, les développeurs de PHP ont alors opté pour l’activation constante de l’extension.

 

Type Union :

Les types Unions sont déjà utilisés dans d’autres langages comme C/C++ ou encore TypeScript, mais font leur apparition dans cette version de PHP. 

A titre d’exemple :

<?php
public function maFonction(TypeA|TypeB $maVariable): int|string

Le type union va permettre de dire : 

La variable $maVariable est du typeA ou typeB et le retour de cette fonction sera respectivement aux types : integer / string. 

 

Static return type :

Dans la nouvelle version de PHP, Static est un nom de classe spécial, il devient alors un type Return valide en plus de self & parent.

<?php

class Test {
         public function maFonction(): static {
                 return $this;
         }
}

WeakMap :

WeakMap est une extension de WeakRefs.

Ajoutée précédemment dans la version 7.4 de PHP, WeakRefs va permettre de supprimer des objets lorsque seul le cache fait référence aux classes d’entités des objets. 

Il permet de conserver une référence à un objet qui n’empêche pas la destruction de celui-ci. C’est utile lorsque seul le cache fait référence à cet objet.

Cela permet d’économiser des ressources lors de la manipulation des objets. 

Voici un exemple issu de la documentation :

<?php
class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...

}

L’opérateur « NullSafe » :

Dans les versions actuelles de PHP, il n’est pas possible d’utiliser l’opérateur coalesce sur les méthodes. Cette fonctionnalité sera disponible dans la version 8 afin de simplifier le code lors de cas complexes comme le montre l’exemple ci-dessous.

<?php
$country =  null;

if ($session !== null) {
    $user = $session->user;
     if ($user !== null) {
        $address = $user->getAddress();
        if ($address !== null) {
            $country = $address->country;
        }
    }
}

<?php

$country = $session?->user?->getAddress()?->country;

Convertir DateTime :

Avec PHP 8, il est dorénavant plus aisé de convertir DateTime. 

Les développeurs ont ajouté :

DateTime::createFromInterface(DateTImeInterface $datetime);

DatetimeImmutable::createFromInterface(DateTimeInterface $datetime);

Ainsi, il est maintenant possible de convertir DateTime et DateTimeImmutable l’un vers l’autre.

 

Ordre des opérateurs de concaténation :

Cette mesure a déjà pu être introduite avec PHP 7.4.

Cependant, celle-ci a pu se généraliser avec cette nouvelle version et prend donc pleinement effet.

Ainsi, PHP s’est vu être amélioré lorsqu’il travaille avec plusieurs opérateurs.

 

A titre d’exemple :

<?php
echo “somme :” . $a + $b;
// Interprétation en PHP <= 7.4 
echo (“somme :” . $a) + $b;
// Interprétation en 8
echo “somme :” . ($a + $b);

 

Nouveaux messages d’erreurs :

Jusqu’à présent, beaucoup d’erreurs apparaissent sous forme de warning ou de notes. 

Afin de remédier à cela, une nouvelle liste de messages d’erreurs a pu être mise en place.

Vous pouvez la retrouver en consultant le lien ci-dessous.

(https://wiki.php.net/rfc/engine_warnings )  

 

Éventail d’autres nouveautés :

La version PHP 8 apporte encore quelques nouveautés :

  • Stringable interface : C’est une interface qui est automatiquement ajoutée aux classes implémentant la méthode __to String(). L’objectif est d’utiliser le type d’union string|Stringable.
  • fdiv : Avec fdiv, une division par 0 est autorisée. Les résultats possibles seront : INF, -INF ou NAN.
  • Type errors : Avant PHP8, les types errors étaient déclenchés uniquement par les fonctions définies par le développeur. Dorénavant, les fonctions internes à PHP8 émettront des types errors.

 

Pour conclure

Ainsi les nouvelles fonctionnalités relatives à PHP 8 sont donc assez nombreuses et permettent de simplifier le code, tout en le rendant plus lisible des développeurs.

A titre d’exemple, le compilateur jit, permet aux pages de charger plus rapidement, impactant ainsi positivement l’expérience utilisateur. 

La mise à jour sur l’ordre des opérateurs de concaténations tend à une amélioration de la logique de développement. 

Enfin, la nouvelle liste de messages d’erreurs va permettre d’identifier plus rapidement la source du problème.

Vous pouvez trouver l’ensemble des nouveautés implémentées dans la nouvelle version de php à l’adresse suivante : https://wiki.php.net/rfc#php_80