PHP 8 : toutes les infos sur la nouvelle mise à jour

Le PHP est l’un des langages de programmation les plus faciles à apprendre. Avec un bon tutoriel et la bonne motivation, vous pouvez écrire vos premiers scripts en quelques heures et exécuter des commandes. La version actuelle de PHP 7 a permis d’optimiser sa vitesse, ce qui a conduit à un meilleur ranking. Maintenant toutefois, le langage open source fait l’objet d’une nouvelle mise à jour majeure avec la version 8.0.

Le développeur Brent Roose a récemment publié des informations sur les toutes nouvelles fonctionnalités de la version 8 de PHP. Comme les travaux sur la nouvelle version sont toujours en cours, d’autres changements devraient être annoncés dans les mois à venir, jusqu’à la version finale.

A quand la sortie de PHP 8 ?

Après une longue période d’incertitude concernant le jour de sortie de PHP 8, les développeurs ont désormais arrêté la date du 26 novembre 2020. Cela correspond au cycle normal de 3 ans de PHP. Par ailleurs, PHP 7.4 a été publié en décembre 2019 et le support pour PHP 7.1 a été interrompu. De nombreux sites Web écrits avec PHP utilisent encore une ancienne version qui ne sera bientôt plus prise en charge. Garder le code de son site à jour et utiliser les nouvelles versions de PHP présentent certains avantages. Les nouvelles fonctions offrent plus de possibilités, les performances peuvent être sensiblement augmentées et les failles de sécurité sont gérées.

Essayez PHP 8 dès maintenant !

Si vous êtes client du service d’hébergement Web de IONOS, vous pouvez désormais tester la version bêta de PHP 8. Vous n’êtes pas encore client ? Optez pour l’une de nos offres économiques d’hébergement Web. Dans votre espace client IONOS, vous pouvez modifier la version actuelle de PHP, et opter pour la version bêta de PHP 8. Mais attention : il n’est pas recommandé d’utiliser la version bêta de PHP 8 pour les systèmes de production.

Remarque

Entre-temps, les premières versions alpha de PHP 8 ont été publiées. Cependant, ces dernières sont uniquement destinées à des fins de test et ne doivent en aucun cas être utilisées dans des versions en ligne de sites Web ou d’applications.

Existe-t-il des complications avec l’ancien code ?

Comme PHP 8 est une nouvelle version majeure, il faut s’attendre à ce que l’ancien code ne soit plus compatible. Toutefois, la plupart des modifications susceptibles d’entraîner des complications étaient déjà obsolètes dans les versions 7.2, 7.3 et 7.4.

Parmi les dernières modifications, citons :

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Reflection export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

Si vous avez toujours maintenu votre code à jour, vous n’aurez pratiquement aucun problème, même si les changements rétroactifs sont incompatibles. Une liste complète des changements de cette Major Release est disponible dans les notes GitHub.

Note

Microsoft a annoncé que la société n’offrira plus de support Windows pour PHP 8 et les versions ultérieures. Cependant, les développeurs du langage PHP ont déjà annoncé qu’ils voulaient combler eux-mêmes ce vide.

Les nouvelles fonctionnalités de PHP 8

La nouvelle version de PHP devrait être dotée de nouvelles fonctionnalités qui offriront aux développeurs Web de nombreuses possibilités supplémentaires.

Compilateur JIT

La plus grande innovation à venir est le compilateur JIT, qui devrait améliorer sensiblement les performances. PHP n’est pas compilé, mais interprété ligne par ligne. Le compilateur JIT (Just in Time) est maintenant censé compiler des parties du code pendant l’exécution et agir donc comme une version en cache du code. Cela devrait conduire à une amélioration massive des performances.

Cette nouvelle fonctionnalité de PHP 8 a déjà été testée de manière assez impressionnante par Pedro Escudero. Ce dernier a utilisé un script simple pour comparer les versions 5.3, 7.4 et 8 (avec et sans JIT). Ainsi, il a exécuté le script 100 fois dans chacune des versions et a ensuite calculé le temps moyen nécessaire à l’exécution.

Les valeurs moyennes suivantes ont donc été obtenues :

Version Temps en secondes
5.3 0.64574003219604
7.4 0.10253500938416
8 (sans JIT) 0.098223924636841
8 (avec JIT) 0.053637981414795

Si le passage de la version 7.4 à la version 8 sans JIT ne fait pas grande différence, la différence par rapport à la version 8 avec JIT est significative. Le compilateur JIT permet une amélioration des performances de plus de 45 %.

L’extension JSON toujours active

Dans les versions antérieures du langage de script, l’extension JSON pouvait être désactivée de manière optionnelle. Mais comme JSON est un format de données très important, les développeurs de PHP ont décidé de laisser l’extension activée en permanence. On suppose que cela simplifie le travail avec PHP.

Type Union

Les types Union ont déjà fait leur apparition dans d’autres langages comme C/C++, TypeScript ou Haskell. Ici, deux types ou plus peuvent former une union et tout type mentionné peut être utilisé. Dans le code en soi, on pourrait par exemple avoir :

public function foo(Foo|Bar $input): int|float;

Cependant, il existe une restriction, car void ne peut pas faire partie d’un type union, car il ne produit pas de valeur de retour. En outre, les unions nulles peuvent être déclarées avec les mentions |null ou ? , comme dans cet exemple :

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Static return type

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

WeakMap

WeakRefs a déjà été ajouté à PHP 7.4, mais voici maintenant WeakMaps, l’extension de cette fonction. WeakMaps et WeakRefs peuvent être utilisés pour supprimer des objets lorsque seul le cache fait référence aux classes d’entités des objets. Cela permet d’économiser des ressources lors de la manipulation des objets. Un exemple tiré de la documentation :

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

Dans les versions précédentes, il fallait utiliser get_class() pour attribuer une classe aux objets. Maintenant, vous pourrez toutefois appliquer ::class aux objets. Cela permet souvent de réduire la taille du code source.

Stringable interface

La stringable interface met en place une interface de manière automatique. Auparavant, cette étape devait être effectuée manuellement. Cela peut être fait pour toutes les chaînes de caractères ou lorsque __toString() est implémenté. Dans le code en soi, cela ressemble à ceci :

class Foo
{
    public function __toString(): string
    {
        return ‘foo’;
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar(‘abc’);

Convertir DateTime

Avec PHP 8, il est beaucoup plus facile de convertir DateTime. Les développeurs ont ajouté DateTime::createFromInterface() et DatetimeImmutable::createFromInterface(). Ainsi, il est maintenant possible de convertir DateTime et DateTimeImmutable l’un vers l’autre.

fdiv

Avec fdiv, une division par 0 est autorisée. Vous obtenez alors INF, -INF ou NAN comme valeur de retour.

Type annotations

La nouvelle version PHP 8 comprend des annotations de type correctes pour toutes les fonctions et méthodes internes.

Type errors

Auparavant, seules les fonctions définies par l’utilisateur déclenchaient les TypeErrors, les fonctions internes émettaient un avertissement et null. À partir de PHP 8, les fonctions internes produiront également des TypeErrors.

Reclassified engine warnings

Jusqu’à présent, on notait de nombreuses erreurs qui n’apparaissaient que sous forme de warning ou de note. Une mise à jour a maintenant été effectuée. Une liste complète des nouveaux messages d’erreur PHP est disponible dans la documentation.

Default error reporting level

Les erreurs qui étaient auparavant ignorées seront à l’avenir affichées sous la forme E_ALL, E_NOTICE et E_DEPRECATED. Ces erreurs existaient déjà avant la version 8, mais n’étaient pas marquées de manière évidente.

@ ne supprime plus les fatal errors

Au lieu de supprimer les erreurs avec l’opérateur @, comme c’était le cas auparavant, vous pouvez maintenant paramétré display_errors=Off sur le serveur.

Ordre des opérateurs de concaténation

Cette mesure a déjà été introduite avec PHP 7.4 mais elle prend maintenant pleinement effet. PHP réagit désormais de manière plus intelligente lorsqu’il travaille avec plusieurs opérateurs. On aura par exemple le code suivant :

echo "sum: " . $a + $b;

était jusqu’à présent interprété par PHP comme…

echo ("sum: " . $a) + $b;

PHP 8 en fait maintenant…

echo "sum: " . ($a + $b);

Reflection

Les signatures ont été modifiées. A l’origine, Reflection était spécifié comme suit :

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

Avec PHP 8, ce sera écrit comme suit :

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

Pour prendre en charge PHP 7 et PHP 8 en même temps, il est nécessaire de procéder de la sorte :

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);

Ces fonctionnalités de PHP 8 sont désormais sûres. Toutefois, d’autres nouvelles fonctionnalités sont attendues d’ici la version finale.


Attendez ! Nous avons quelque chose pour vous !
Votre messagerie professionnelle

Créez une adresse personnalisée
Affichez votre sérieux sur Internet
Nom de domaine inclus
À partir d' 1 € TTC/mois
Conseiller personnel inclus !