Quoi de neuf dans le PHP 8 (Fonctionnalités, améliorations et le compilateur JIT) ?

Topic : Programmation   | Publié il y a 1 mois

Le PHP 8 sera publié le 26 novembre 2020. Il s'agit d'une nouvelle version majeure, ce qui signifie qu'elle introduira quelques changements importants, ainsi que de nombreuses nouvelles fonctionnalités et améliorations de performance. Pour l'instant, PHP 8 est en gel de fonctionnalités, ce qui signifie qu'aucune nouvelle fonctionnalité ne peut plus être ajoutée.
Si vous êtes resté à jour avec les dernières versions, la mise à jour ne devrait pas être trop difficile, car la plupart des changements importants étaient auparavant obsolètes dans les versions 7.*.
En plus de ces changements, PHP 8 apporte également un ensemble de nouvelles fonctionnalités telles que le compilateur JIT, les types d'unions, les attributs et plus encore.

Quels sont les problèmes posés par l'ancien code ?

Comme PHP 8 est une nouvelle version majeure, il faut s'attendre à ce que l'ancien code ne soit plus compatible. Cependant, la plupart des modifications susceptibles d'entraîner des complications ont déjà été traitées dans les versions 7.2, 7.3 et 7.4.

Parmi les derniers changements, on peut citer :

  •    Le type réel
       array_key_exists() avec des objets
       Filtre FILTER_SANITIZE_MAGIC_QUOTES
       Réflexions sur les méthodes export()
       mb_strrpos() avec l'encodage comme 3ème argument
       implode() parameter order mix
       Détacher le $this des fermetures non statiques
       fonction hebrevc()
       Fonction convert_cyr_string()
       Fonction money_format()
       Fonction ezmlm_hash()
       Fonction restore_include_path()
       directive allow_url_include ini

Si vous avez toujours maintenu votre code à jour, vous n'aurez aucun problème pour migrer vers PHP 8, même si la nouvelle mise à jour sera une version majeure. Une liste complète des changements peut être trouvée dans les notes de mise à jour sur GitHub

Voici les nouvelles fonctionnalités du PHP 8

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

Compilateur JIT

Parmi les principales nouveautés du PHP 8 figure 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) fonctionne en compilant des parties du code pendant l'exécution - et ce faisant, il agit 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 par Pedro Escudero. Il a utilisé un simple script pour comparer les versions 5.3, 7.4 et 8 (avec et sans JIT). Pour cela, il a exécuté le script 100 fois dans chaque version et a ensuite calculé le temps moyen.

Les valeurs moyennes suivantes sont les résultats de ses tests :

Version Temps en secondes 
5.3 0.64574003219604 
7.4 0.10253500938416 
8 (without JIT) 0.098223924636841 
8 (with JIT) 0.053637981414795

Même si le passage de la version 7.4 à la version 8 sans JIT ne fait pas une grande différence, la différence par rapport à la version 8 avec JIT est significative. Le compilateur JIT améliore les performances de plus de 45 %.

L'extension JSON est toujours activée

Dans les versions antérieures du langage de script, l'extension JSON avait la possibilité d'être désactivée. Cependant, étant donné que JSON est un format de données très important, les développeurs de PHP ont décidé de veiller à ce que l'extension soit activée à tout moment. On suppose que cela simplifie le travail avec PHP.

Types d'Union

Les Union Types sont connus à partir d'autres langages comme C/C++, TypeScript ou Haskell. Ici, deux types ou plus peuvent former une union et n'importe lequel des types mentionnés peut être utilisé. Dans le code lui-même, cela peut ressembler à ceci :

fonction publique foo(Foo|Bar $input) : int|float ;

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

fonction publique foo(Foo|null $foo) : void ;
fonction publique bar(?Bar $bar) : void ;

Type de retour statique

Static est un nom de classe spécial et devient un type de retour valide dans la nouvelle version en plus de self & parent.

WeakMap

WeakRefs a déjà été ajouté dans le PHP 7.4. Avec PHP 8, cependant, des WeakMaps ont été incluses, qui sont 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 de gérer les objets en économisant les ressources. Voici un exemple tiré de la documentation :

classe FooBar {
   privé WeakMap $cache ;
   fonction publique getSomethingWithCaching(objet $obj) {
       return $this->cache [$obj] ??= $this->computeSomethingExpensive($obj) ;
   }
   // ...
}

Utilisation ::classe pour les objets

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

Interface à chaînes

L'interface chaînable met en place une interface automatiquement. 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ée. Dans le code lui-même, cela ressemble à ceci :

classe Foo
{
   fonction publique __toString() : string
   {
       retour "foo" ;
   }
}
function bar(Stringable $stringable) { /* ... */ }
bar(nouveau Foo()) ;
bar('abc') ;

Convertir la date et l'heure

Avec PHP 8, il est beaucoup plus facile de convertir l'heure de la date. Les développeurs ont ajouté DateTime::createFromInterface() et DatetimeImmutable::createFromInterface(). Il est ainsi possible de convertir DateTime et DateTimeImmutable .

L'utilisation de la division fdiv avec 0 est autorisée. Vous obtenez alors INF, -INF ou NAN comme valeur de retour.

Tapez les annotations

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

Erreurs de type

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

Alertes de moteur reclassées

Jusqu'au PHP 8, il y avait beaucoup d'erreurs qui ne faisaient qu'émettre un avertissement ou une note. Cette page a été mise à jour. Une liste complète des nouveaux messages d'erreur PHP se trouve dans la documentation.

Niveau de notification d'erreur par défaut

Les erreurs qui étaient auparavant ignorées seront affichées comme : E_ALL, E_NOTICE, et E_DEPRECATED. Ces erreurs existaient déjà dans les versions précédentes, mais n'étaient pas clairement indiquées.

@ ne supprimera pas les erreurs plus

Cette nouvelle fonctionnalité permet également de détecter les erreurs. Au lieu de les supprimer avec l'opérateur @, comme c'était le cas auparavant, vous devez maintenant vous assurer que vous avez défini display_errors=Off sur le serveur.

Ordre des opérateurs de chaîne

Cette fonctionnalité a été introduite avec le PHP 7.4 mais prend maintenant pleinement effet. PHP 8 réagit plus intelligemment lorsqu'il travaille avec plusieurs opérateurs. Le code suivant en est un bon exemple :

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

Ceci était précédemment interprété par PHP comme :

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

PHP 8 le transforme maintenant en :

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

Réflexion

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

ReflectionClass::newInstance($args) ;
ReflectionFunction::invoke($args) ;
Méthode de réflexion::invoquer($objet, $args) ;

Cependant, en PHP 8, il est maintenant écrit comme ceci :

ReflectionClass::newInstance(...$args) ;
FonctionRéflexion::invoke(...$args) ;
MéthodeRéflexion::invoke($objet, ...$args) ;

Pour supporter PHP 7 & PHP 8 en même temps, vous devez procéder comme suit :

ReflectionClass::newInstance($arg = null, ...$args) ;
ReflectionFunction::invoke($arg = null, ...$args) ;
Méthode de réflexion::invoquer($objet, $arg = null, ...$args) ;

Ces fonctionnalités de PHP 8 vont certainement être déployées. Cependant, de nouvelles fonctionnalités supplémentaires devraient être incluses et annoncées avec la sortie de PHP 8.