PHP 8 est disponible !
ven, 27/11/2020 - 14:36
Conformément à la feuille de route, le projet PHP a annoncé la sortie de PHP 8. Il s'agit d'une version majeure, qui en tant que telles apporte des nouveautés, mais aussi des changements de ruptures.
Les nouvelles fonctionnalités du langage sont nombreuses, et pour la plupart plutôt intéressantes en ce qui concerne la concision du code, sa clarté ou encore sa sûreté.
Viennent par exemple les arguments nommés pour les fonctions. Les arguments nommés auto-documentent le code et permettent de s'affranchir de l'ordre des arguments.
Par exemple lorsque nous avions avec PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
Nous avons avec PHP 8
htmlspecialchars($string, double_encode: false);
La nouvelle expression match peut remplacer avantageusement l'expressions swith.
En PHP 7 :
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!
En PHP 8 :
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected
On remarque l'absence des instructions break. Le code des branchements de l'expression match doit tenir sur une seule ligne par branchement.
Le code pour déclarer et initialiser des membres de classes est désormais beaucoup plus concis.
En PHP 7 :
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0,
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
En PHP 8 :
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
Les types d'union viennent remplacer les annotations PHPDoc pour déclarer une combinaison de types.
En PHP 7 :
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
en PHP 8 :
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
Le nouvel opérateur nullSafe permet de faire des vérifications conditionnelles de null dans une chaîne d'appels. Lorsque l'évaluation d'un élément de la chaîne d'appels échoue, l'opération entière retourne null.
En PHP 7
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
En PHP 8 :
$country = $session?->user?->getAddress()?->country;
On peut encore mentionner une amélioration du système de typage et de la gestion des erreurs. Par exemple une vérification de type plus sévère pour les opérateurs arithmétiques et bit à bit et le fait que l'opérateur @ ne muselle plus les erreurs fatales.
PHP 8 introduit deux moteurs de compilation Just-in-Time (JIT), racing JIT et Function JIT. Tracing JIT, le plus prometteur des deux selon le projet PHP, montre 3 fois plus de performances sur certains benchmarks et de 1,5 à 2 fois plus de performances sur certaines applications à longue durée d'exécution. De quoi l'on peut déduire que dans le cas d'applications typiques de PHP, à savoir la génération de pages Web, ces compilateurs JIT ne semblent pas très utiles en l'état.
Parmi les changements de rupture, en plus du nouveau comportement de l'opérateur @ mentionné plus haut, viennent de nombreuses reclassifications des avertissements anciennement émis par le moteur d'exécution. Par exemple, une division par zéro lève désormais une exception DivisionByZeroError au lieu d'émettre un avertissement. Une variable indéfinie (cas très fréquent dans du vieux code PHP) n'émet plus un avertissement 'notice', mais lève une exception Error, etc.
Nous n'avons bien sûr fait ici qu'effleurer les nouveautés de PHP 8. Le mieux, pour bien découvrir cette nouvelle version, est sans aucun doute de l'essayer. Ce que l'on pourra faire en s'appuyant sur ce guide de migration de PHP 7.4.x à PHP 8 fourni par le projet PHP. Ce guide de migration, notamment, expose dans le détail tous les changements de rupture introduits par PHP 8