Quoi de neuf dans PHP 8.1 ?

0
63

PHP 8.1 est sorti en novembre 2021 en tant que dernière version mineure du langage PHP. Il ajoute plusieurs nouvelles fonctionnalités linguistiques ainsi que des améliorations plus petites et des améliorations de performances. Il y a quelques changements importants à prendre en compte, mais la plupart des mises à jour de PHP 8.0 devraient être simples.

Nouvelles fonctionnalités

Le PHP de cette année update ajoute plusieurs nouvelles fonctionnalités pour améliorer la productivité des développeurs. Voici ce que vous pourrez utiliser après la mise à niveau.

Enums

Les types Enum font enfin partie du langage PHP. Ils vous permettent de spécifier qu'une valeur doit faire partie d'un ensemble de constantes prédéfinies.

Par rapport aux constantes régulières, les énumérations vous offrent une validation intégrée lorsqu'elles sont utilisées comme paramètres de méthode et valeurs de retour. Ils peuvent également avoir des valeurs et des méthodes de support qui associent un comportement supplémentaire.

# PostStatus de classe PHP 8.0 { const Ébauche = 1 ; const Publié = 2 ; }   # PHP 8.0 – Impossible d'indiquer que la valeur # de `$PostStatus` doit être définie # dans `PostStatus`. classe Message { fonction publique __construct( chaîne publique $Headline, public int $PostStatus) {} }   # PHP 8.1 enum PostStatus { cas Brouillon = 1 ; cas Publié = 2 ; }   # PHP 8.1 – Il est désormais impossible de passer une # valeur invalide comme statut. classe Message { fonction publique __construct( chaîne publique $Headline, public PostStatus $PostStatus) {} }

Propriétés en lecture seule

Le nouveau mot-clé readonly marque une propriété de classe comme immuable. Les propriétés en lecture seule ne peuvent être écrites qu'une seule fois. Essayer de changer leur valeur après l'initialisation générera une erreur.

Publicité

Cela simplifie la création d'objets à valeur immuable simples. Auparavant, vous deviez ajouter des méthodes répétitives à une classe si vous vouliez exposer des valeurs de propriété sans autoriser la modification. Vous pouvez désormais rendre les propriétés publiques sans risquer de subir des mutations involontaires.

# PHP 8.0 – Cela devient vite répétitif ! classe Message { fonction publique __construct( chaîne protégée $Headline) {}   fonction publique getHeadline() : chaîne { renvoie $this -> Gros titre; } }   # Classe PHP 8.1 Message { fonction publique __construct( chaîne publique en lecture seule $Headline) {} }

Types d'intersections

Le système de types de PHP comprend désormais les intersections. Ceux-ci vous permettent de spécifier qu'une valeur doit implémenter plusieurs interfaces.

Ceci est utile dans les cas où le code doit appeler des méthodes d'instance définies par deux interfaces différentes. Auparavant, vous deviez créer une nouvelle interface étendant à la fois celles souhaitées. Ce n'était pas toujours pratique dans les cas où vous ne pouviez pas modifier la classe cible pour implémenter votre nouvelle interface.

Les intersections sont définies en combinant deux types ou plus avec un caractère esperluette. Ils ajoutent plus de flexibilité au système de types après l'introduction des types d'union dans PHP 8.0. Une mise en garde est que vous ne pouvez actuellement pas utiliser les types d'intersection et d'union ensemble – Countable&Stringable|CustomType est interdit dans cette version.

# L'interface PHP 8.0 CountableString étend Countable, Stringable {}   fonction publique countAndReport(CountableString $value) : vide { echo "$valeur : " . compte($valeur); }   # Fonction publique PHP 8.1 countAndReport(Countable&Stringable $value) : vide { echo "$valeur : " . compte($valeur); }

Fibres

Les fibres sont un mécanisme pour faciliter l'exécution simultanée. Ils facilitent la mise en œuvre de blocs de code réactivables qui peuvent être suspendus n'importe où dans la pile.

L'API Fibers est de niveau relativement bas. On ne s'attend pas à ce que les développeurs des utilisateurs finaux interagissent avec lui régulièrement. Au lieu de cela, Fibers sera intégré dans des bibliothèques offrant des API asynchrones et des implémentations de boucles d'événements. Il s'agit d'un système de contrôle de flux qui permet des abstractions simplifiées de niveau supérieur.

Publicité

Les fibres offrent un chemin vers les appels de fonction asynchrones qui ressemblent à des opérations synchrones régulières. Vous pouvez supprimer le passe-partout associé aux promesses et aux rappels. Les fibres gèrent la suspension et la reprise du code aux points appropriés, offrant une API pour les implémentations bloquantes et non bloquantes des opérations.

# PHP 8.0 – Un client HTTP basé sur des promesses $response = $httpClient -> demande("http://example.com") -> puis(fonction (Réponse $Réponse) { return $Response -> getBody(); }); imprimer $réponse ;   # PHP 8.1 – Un client HTTP utilisant Fibers en interne $response = $httpClient -> demande("https://example.com"); imprimer $réponse -> getBody();

Callables de première classe

Les Callables sont désormais des citoyens de première classe dans le langage PHP. Cela signifie que vous pouvez affecter directement des fonctions aux variables, sans utiliser l'ancienne syntaxe de tableau ou la création de fermeture explicite.

Ce changement sera plus utile dans les contextes de programmation fonctionnelle. La transmission de fonctions est plus propre et plus facile avec l'affectation directe de variables.

# PHP 8.0 $builtin = Closure::fromCallable("array_filter"); $method = [$this, "getData"];   # PHP 8.1 $builtin = array_filter(…); $méthode = $this -> getData(…);

Le … remplaçant les paramètres de la fonction est une partie obligatoire de la syntaxe. Cela signale que vous souhaitez affecter la fonction à la variable, au lieu d'appeler la fonction et d'affecter sa valeur de retour.

Utilisation des nouveaux initialiseurs

Une autre nouvelle fonctionnalité est le nouveau mot-clé dans les initialiseurs. Vous pouvez désormais utiliser des instances d'objets comme valeurs de paramètre par défaut :

# Classe PHP 8.0 SendNewsletterAction { Mailer protégé $Mailer ; fonction publique __construct(?Mailer $Mailer=null) { $ceci -> Mailer = $ Mailer ?? nouveau SmtpMailer(); } }   # Classe PHP 8.1 SendNewsletterAction { fonction publique __construct( protégé en lecture seule Mailer $Mailer=new SmtpMailer()) {} } Publicité

Le nouveau mot-clé fonctionnera également avec les variables statiques, les constantes globales et les arguments d'attribut. Cela vous donne plus de flexibilité et de commodité lorsque vous voulez une instance d'objet comme valeur par défaut.

Constantes de classe finale

Le mot-clé final est désormais pris en charge pour les constantes de classe. Vous pouvez marquer des constantes individuelles comme finales sans sceller toute la classe. Auparavant, les classes enfants étaient libres d'écraser la valeur des constantes héritées des parents.

# PHP 8.0 – Impossible d'interdire cela sans # rendre la classe `finale` toute entière DemoClass { public const DemoConstant = 1; } class ChildClass étend DemoClass { public const DemoConstant = 2; }   # PHP 8.1 – Seule la constante peut être “finale”. classe DemoClass { const public final DemoConstant = 1 ; } class ChildClass étend DemoClass { //Lève une erreur fatale public const DemoConstant = 2; }

Autres

Outre les éléments importants énumérés ci-dessus, PHP 8.1 ajoute également quelques fonctionnalités pratiques qui aident à rendre le code plus auto-documenté. Vous pouvez écrire des nombres octaux avec une notation explicite, telle que 0o14, et utiliser le nouveau type ne jamais retourner pour désigner les fonctions qui lèveront une exception ou quitteront le script actuel. Cela aide à informer la détection de code mort dans le logiciel d'analyse statique.

Il y a quelques nouvelles fonctions dans la bibliothèque standard. array_is_list() vous permet de vérifier si un tableau est une liste ([“foo”, “bar”]) ou associatif ([“foo” => “bar”]), fournissant une implémentation intégrée pour une fonction qui&# 8217;s couramment trouvés dans le code utilisateur existant. fsync() et fdatasync() vous permettent de synchroniser les modifications du pointeur de fichier sur le support de stockage sous-jacent. La prise en charge du sodium pour les algorithmes de hachage XChaCha20 et Ristretto255 a également été ajoutée.

Enfin, cette version apporte la perspective d'améliorations des performances. Des optimisations comprenant un cache d'héritage de classe pourraient offrir une augmentation gratuite des performances allant jusqu'à 8 %. Cela serait particulièrement visible dans les bases de code fortement orientées objet avec de nombreuses relations parent-enfant. PHP va maintenant mettre ces liens en cache afin de ne pas les reconstruire continuellement.

Modifications rétrocompatibles

En tant que modification mineure de la version, il y a quelques modifications importantes et obsolètes à prendre en compte avant de procéder à la mise à niveau. Voici les plus susceptibles de poser problème dans votre base de code :

  • L'écrasement du tableau $_GLOBALS n'est plus autorisé. Vous pouvez toujours écrire sur des clés individuelles, mais ne pouvez pas réaffecter $_GLOBALS lui-même.
  • Si vous étendez une classe intégrée, vos méthodes remplacées doivent déclarer un type de retour compatible avec celui d'origine. Un avertissement de dépréciation sera émis si vous spécifiez un type incompatible. Un attribut #[ReturnTypeWillChange] est actuellement pris en charge comme moyen d'éviter cela pour les bibliothèques qui doivent prendre en charge plusieurs versions de PHP.
  • Passer des paramètres null à des paramètres non nullables de fonctions internes a été déprécié. Cela était auparavant autorisé, mais était incompatible avec l'application de typehint pour les fonctions créées par l'utilisateur.
  • Les transtypages implicites de int en float ont été dépréciés – cela affecte des scénarios tels que $array[10.1], où la mantisse sera perdue car les tableaux doivent avoir des clés entières.
  • Dans le cadre du travail en cours de PHP pour supprimer les types de ressources, plusieurs groupes de fonctions fonctionnent désormais avec de nouveaux objets au lieu de ressources. Ces modifications s'appliquent aux API FileInfo, FTP, IMAP, LDAP, PgSQL et PSpell.
  • Les fonctions qui fonctionnent avec les entités HTML telles que htmlspecialchars() et htmlentities() échappent désormais aux apostrophes par défaut, donc ' deviendra '.
  • L'appel direct de méthodes statiques sur des traits est déconseillé ; vous devriez appeler la méthode sur une classe qui utilise le trait à la place.

D'autres suppressions et dépréciations affectent des API individuelles, notamment PDO, MySQLi et Standard. Vous devriez consulter l'intégralité du guide de migration avant de mettre à niveau votre projet.

Publicité

Dans l'ensemble, les changements de ce cycle sont assez inoffensifs. Les bases de code qui étaient déjà conformes aux meilleures pratiques PHP modernes ne devraient pas rencontrer trop de problèmes lors du passage à la version 8.1. Les frameworks populaires, notamment Symfony et Laravel, prennent déjà en charge PHP 8.1.

Conclusion

PHP 8.1 ajoute de nombreuses nouvelles fonctionnalités qui rendent l'expérience de développement plus facile et plus rationalisée. Les énumérations ont longtemps été une pièce manquante du système de types tandis que les propriétés en lecture seule et les nouveaux initialiseurs permettront d'écrire plus rapidement de nouvelles classes.

Les fibres aident à rendre PHP asynchrone plus accessible tandis que les appels de première classe facilitent la fonction rationalisée références lors de la pratique des techniques de programmation fonctionnelle. Tous ces changements font encore plus mûrir PHP en tant que langage flexible qui offre de solides garanties de sécurité pour votre code tout en restant simple à utiliser.