Sortie du langage de programmation PHP 8.1

Après un an de développement, la sortie du langage de programmation PHP 8.1 a été présentée. La nouvelle branche comprend une série de nouvelles fonctionnalités, ainsi que plusieurs modifications qui rompent la compatibilité.

Principales améliorations de PHP 8.1 :

  • Ajout de la prise en charge des énumérations, par exemple, vous pouvez désormais utiliser les constructions suivantes : enum Status { case Pending ; cas Actif ; cas Archivé; } class Post { public function __construct(private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Ajout de la prise en charge des threads légers appelés Fibres, qui vous permettent de gérer les threads d'exécution à un niveau bas. Le support Fibre devrait être ajouté aux frameworks Amphp et ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('after suspending'); // ... }); $valueAfterSusending = $fiber->start(); $fiber->resume('après reprise');
  • L'implémentation du cache de code objet (opcache) a été améliorée, permettant de mettre en cache des informations sur l'héritage de classe. L'optimisation a permis d'augmenter les performances de certaines applications de 5 à 8 %. D'autres optimisations incluent l'optimisation du fonctionnement JIT, la mise en œuvre du support JIT pour l'architecture ARM64 (AArch64), l'accélération de la résolution de noms, l'optimisation des bibliothèques timelib et ext/date, l'augmentation des performances de sérialisation et de désérialisation, l'optimisation de get_declared_classes(), burst() , fonction strtr(), strnatcmp(), dechex(). En général, on constate une augmentation des performances de 23.0 % pour Symfony Demo et de 3.5 % pour WordPress.
  • L'opérateur de décompression à l'intérieur des tableaux "...$var", qui permet la substitution des tableaux existants lors de la définition d'un nouveau tableau, a été étendu pour prendre en charge les clés de chaîne (auparavant, seuls les identifiants numériques étaient pris en charge). Par exemple, vous pouvez désormais utiliser dans le code : $array1 = [« a » => 1]; $tableau2 = ["b" => 2]; $tableau = ["a" => 0, …$tableau1, …$tableau2]; var_dump($tableau); // ["a" => 1, "b" => 2]
  • Il est permis d'utiliser le mot-clé "new" dans les initialiseurs, comme dans les définitions de fonctions comme paramètre par défaut ou dans les attributs d'argument. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Il est possible de marquer les propriétés de classe pour un accès en lecture seule (les informations contenues dans ces propriétés ne peuvent être écrites qu'une seule fois, après quoi elles ne seront plus disponibles pour modification). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Autre'; > Erreur : Impossible de modifier la propriété en lecture seule Post::$title
  • Une nouvelle syntaxe a été implémentée pour les objets appelables - une fermeture peut désormais être formée en appelant une fonction et en lui passant la valeur "..." comme argument (c'est-à-dire myFunc(...) au lieu de Closure::fromCallable('myFunc ')) : fonction foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a : 1, b : 2);
  • Ajout d'une prise en charge complète des types d'intersection, vous permettant de créer de nouveaux types en combinant ceux existants. Contrairement aux types d'union, qui définissent des collections de deux types ou plus, les types d'intersection nécessitent la présence non pas d'un des types répertoriés, mais de tous les types spécifiés dans l'ensemble à remplir. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Il existe un nouveau type « jamais » qui peut être utilisé pour informer les analyseurs statiques qu'une fonction mettra fin à l'exécution du programme, par exemple en lançant une exception ou en exécutant la fonction de sortie. function dd(mixed $input): never { exit; }
  • Une nouvelle fonction array_is_list a été proposée, qui permet de déterminer que les clés du tableau sont classées par ordre de valeurs numériques croissantes, à partir de 0 : $list = ["a", "b", "c"]; array_is_list($liste); // vrai $notAList = [1 => « a », 2 => « b », 3 => « c »]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // FAUX
  • Vous pouvez désormais utiliser le mot-clé "final" pour empêcher que les constantes de la classe parent soient remplacées. class Foo { final public const X = "foo"; } classe Bar extends Foo { public const X = "bar"; > Erreur fatale : Bar::X ne peut pas remplacer la constante finale Foo::X }
  • Les fonctions fsync et fdatasync sont proposées pour forcer la sauvegarde des modifications depuis le cache disque. $file = fopen("exemple.txt", "w"); fwrite($file, "Du contenu"); if (fsync($file)) { echo "Le fichier a été conservé avec succès sur le disque."; } fclose ($ fichier);
  • Ajout de la possibilité d'utiliser les préfixes "0o" et "0O" pour les nombres octaux, en plus du préfixe "0" précédemment utilisé. 016 === 0o16 ; // vrai 016 === 0O16; // vrai
  • Il est proposé de limiter sélectivement l'utilisation de $GLOBALS, ce qui entraînera une violation de la rétrocompatibilité, mais permettra d'accélérer considérablement les opérations avec les tableaux. Par exemple, la possibilité de désactiver l'écriture dans $GLOBALS et de passer $GLOBALS par pointeur est à l'étude. Une analyse de 2000 colis a montré que seuls 23 d'entre eux seraient concernés par ce changement. Par exemple, si la proposition est approuvée, la version 8.1 ne prendra plus en charge les expressions telles que : $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBAUX; non défini($GLOBALS); par_ref($GLOBALS);
  • Les méthodes internes devraient désormais renvoyer le type correct. En PHP 8.1, renvoyer un type qui ne correspond pas à la déclaration de la fonction produira un avertissement, mais en PHP 9.0, l'avertissement sera remplacé par une erreur.
  • Les travaux se sont poursuivis sur le transfert des fonctions de l'utilisation des ressources à la manipulation des objets. Les fonctions finfo_* et imap_* ont été transférées vers les objets.
  • La transmission de valeurs nulles comme arguments aux fonctions internes marquées comme non nullables est obsolète. En PHP 8.1, l'utilisation de constructions comme str_contains("string", null) entraînera un avertissement, et en PHP 9 une erreur.
  • Ajout de la prise en charge des algorithmes de hachage MurmurHash3 et xxHash.

Source: opennet.ru

Ajouter un commentaire