{"id":48113,"date":"2021-08-31T13:31:50","date_gmt":"2021-08-31T11:31:50","guid":{"rendered":"https:\/\/kinsta.com\/?p=101567"},"modified":"2023-08-22T12:34:42","modified_gmt":"2023-08-22T11:34:42","slug":"php-8-1","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/","title":{"rendered":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore"},"content":{"rendered":"<p>Sorti le 25 novembre 2021, <a href=\"https:\/\/wiki.php.net\/todo\/php81\">PHP 8.1 est enfin l\u00e0<\/a>, avec plusieurs fonctionnalit\u00e9s int\u00e9ressantes.<\/p>\n<p>Dans cet article, nous allons couvrir en d\u00e9tail les nouveaut\u00e9s de PHP 8.1. Qu&rsquo;il s&rsquo;agisse de ses nouvelles fonctionnalit\u00e9s, d&rsquo;am\u00e9liorations des performances, de changements importants ou de d\u00e9pr\u00e9ciations, nous allons les passer en revue en profondeur.<\/p>\n<p>Ne bougez pas !<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Nouvelles fonctionnalit\u00e9s de PHP 8.1<\/h2>\n<p>Commen\u00e7ons par couvrir toutes les nouvelles fonctionnalit\u00e9s de PHP 8.1. C&rsquo;est une sacr\u00e9e liste.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"20\" sub-toc=\"true\"><\/kinsta-auto-toc>\n\n<h3>Types d&rsquo;intersection purs<\/h3>\n<p>PHP 8.1 ajoute la prise en charge des types d&rsquo;intersection. C&rsquo;est similaire aux <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#union-types-2-0\">types d&rsquo;union<\/a> introduits dans PHP 8.0, mais leur utilisation pr\u00e9vue est exactement l&rsquo;inverse.<\/p>\n<p>Pour mieux comprendre son utilisation, rafra\u00eechissons la fa\u00e7on dont les d\u00e9clarations de type fonctionnent en PHP.<\/p>\n<p>Essentiellement, vous pouvez ajouter des d\u00e9clarations de type aux arguments des fonctions, aux valeurs de retour et aux propri\u00e9t\u00e9s des classes. Cette affectation est appel\u00e9e indication de type et garantit que la valeur est du bon type au moment de l&rsquo;appel. Sinon, une <a href=\"https:\/\/www.php.net\/manual\/en\/class.typeerror.php\" target=\"_blank\" rel=\"noopener noreferrer\">TypeError<\/a> est imm\u00e9diatement \u00e9mise. En retour, cela vous aide \u00e0 mieux d\u00e9boguer le code.<\/p>\n<p>Cependant, la d\u00e9claration d&rsquo;un type uniques a ses limites. Les types d&rsquo;union vous aident \u00e0 surmonter cela en vous permettant de d\u00e9clarer une valeur avec plusieurs types, et l&rsquo;entr\u00e9e doit satisfaire au moins un des types d\u00e9clar\u00e9s.<\/p>\n<p>D&rsquo;autre part, <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types\" target=\"_blank\" rel=\"noopener noreferrer\">la RFC<\/a> d\u00e9crit les types d&rsquo;intersection comme ceci :<\/p>\n<blockquote><p><em>Un \u00ab type d&rsquo;intersection \u00bb exige qu&rsquo;une valeur satisfasse plusieurs contraintes de type au lieu d&rsquo;une seule.<\/em><\/p>\n<p><em>&#8230;les types d&rsquo;intersection purs sont sp\u00e9cifi\u00e9s \u00e0 l&rsquo;aide de la syntaxe T1&#038;T2&#038;&#8230; et peuvent \u00eatre utilis\u00e9s dans toutes les positions o\u00f9 les types sont actuellement accept\u00e9s&#8230;<\/em><\/p><\/blockquote>\n<p>Notez l&rsquo;utilisation de l&rsquo;op\u00e9rateur <code>&<\/code> (AND) pour d\u00e9clarer les types d&rsquo;intersection. En revanche, nous utilisons l&rsquo;op\u00e9rateur <code>|<\/code> (OR) pour d\u00e9clarer les types d&rsquo;union.<\/p>\n<p>L&rsquo;utilisation de la plupart des types standard dans un type d&rsquo;intersection donnera un type qui ne pourra jamais \u00eatre rempli (par exemple, integer et string). Par cons\u00e9quent, les types d&rsquo;intersection ne peuvent inclure que des types de classe (c&rsquo;est-\u00e0-dire des interfaces et des noms de classe).<\/p>\n<p>Voici un exemple de code montrant comment vous pouvez utiliser les types d&rsquo;intersection :<\/p>\n<pre><code class=\"language-php\">classe A {\n    private Traversable&Countable $countableIterator;\n \n    public function setIterator(Traversable&Countable $countableIterator) : void {\n        $this-&gt;countableIterator = $countableIterator;\n    }\n \n    public function getIterator() : Traversable&Countable {\n        retourne $this-&gt;countableIterator;\n    }\n}<\/code><\/pre>\n<p>Dans le code ci-dessus, nous avons d\u00e9fini une variable <strong>countableIterator<\/strong> comme une intersection de deux types : <strong>Traversable<\/strong> et <strong>Countable<\/strong>. Dans ce cas, les deux types d\u00e9clar\u00e9s sont des interfaces.<\/p>\n<p>Les types d&rsquo;intersection sont \u00e9galement conformes aux r\u00e8gles standard de variance PHP d\u00e9j\u00e0 utilis\u00e9es pour la v\u00e9rification des types et l&rsquo;h\u00e9ritage. Mais il existe deux r\u00e8gles suppl\u00e9mentaires concernant la fa\u00e7on dont les types d&rsquo;intersection interagissent avec le sous-typage. Vous pouvez en savoir plus sur les <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types#variance\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e8gles de variance des types d&rsquo;intersection<\/a> dans sa RFC.<\/p>\n<p>Dans certains langages de programmation, vous pouvez combiner les types Union et les types Intersection dans la m\u00eame d\u00e9claration. Mais PHP 8.1 l&rsquo;interdit. C&rsquo;est pourquoi sa mise en \u0153uvre est appel\u00e9e types d&rsquo;intersection \u00ab purs \u00bb. Cependant, la RFC mentionne que c&rsquo;est \u00ab laiss\u00e9 comme une scope future \u00bb<\/p>\n<h3>Enums<\/h3>\n<p>PHP 8.1 ajoute enfin la prise en charge des enums (\u00e9galement appel\u00e9s \u00e9num\u00e9rations ou types \u00e9num\u00e9r\u00e9s). Il s&rsquo;agit d&rsquo;un type de donn\u00e9es d\u00e9fini par l&rsquo;utilisateur, compos\u00e9 d&rsquo;un ensemble de valeurs possibles.<\/p>\n<p>L&rsquo;exemple d&rsquo;\u00e9num\u00e9ration le plus courant dans les langages de programmation est le type <strong>bool\u00e9en<\/strong>, avec <code>true<\/code> et <code>false<\/code> comme deux valeurs possibles. C&rsquo;est tellement courant qu&rsquo;il est int\u00e9gr\u00e9 dans de nombreux <a href=\"https:\/\/kinsta.com\/fr\/blog\/meilleur-langage-programmation-apprendre\/\">langages de programmation modernes<\/a>.<\/p>\n<p>Conform\u00e9ment \u00e0 la <a href=\"https:\/\/wiki.php.net\/rfc\/enumerations\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a>, les \u00e9num\u00e9rations en PHP seront limit\u00e9es aux \u00ab \u00e9num\u00e9rations d&rsquo;unit\u00e9s \u00bb au d\u00e9part :<\/p>\n<blockquote><p><em>La port\u00e9e de cette RFC est limit\u00e9e aux \u00ab \u00e9num\u00e9rations d&rsquo;unit\u00e9s \u00bb, c&rsquo;est-\u00e0-dire aux \u00e9num\u00e9rations qui sont elles-m\u00eames une valeur, plut\u00f4t qu&rsquo;une simple syntaxe fantaisiste pour une constante primitive, et qui n&rsquo;incluent pas d&rsquo;informations associ\u00e9es suppl\u00e9mentaires. Cette capacit\u00e9 offre une prise en charge consid\u00e9rablement \u00e9largie pour la mod\u00e9lisation des donn\u00e9es, les d\u00e9finitions de types personnalis\u00e9es et le comportement de style monade. Les Enums permettent la technique de mod\u00e9lisation consistant \u00e0 \u00ab rendre les \u00e9tats non valides irrepr\u00e9sentables \u00bb, ce qui conduit \u00e0 un code plus robuste n\u00e9cessitant moins de tests exhaustifs.<\/em><\/p><\/blockquote>\n<p>Pour arriver \u00e0 ce stade, l&rsquo;\u00e9quipe PHP a \u00e9tudi\u00e9 de nombreux langages qui prennent d\u00e9j\u00e0 en charge les \u00e9num\u00e9rations. <a href=\"https:\/\/github.com\/Crell\/enum-comparison\" target=\"_blank\" rel=\"noopener noreferrer\">Leur \u00e9tude<\/a> a r\u00e9v\u00e9l\u00e9 que l&rsquo;on peut classer les \u00e9num\u00e9rations en trois groupes g\u00e9n\u00e9raux : Constantes fantaisistes, objets fantaisistes et types de donn\u00e9es alg\u00e9briques (ADT) complets. C&rsquo;est une lecture int\u00e9ressante !<\/p>\n<p>PHP impl\u00e9mente les \u00e9num\u00e9rations \u00ab Fancy Objects \u00bb, et pr\u00e9voit de les \u00e9tendre aux ADT complets \u00e0 l&rsquo;avenir. Il est conceptuellement et s\u00e9mantiquement model\u00e9 sur les types \u00e9num\u00e9r\u00e9s de Swift, Rust et Kotlin, bien qu&rsquo;il ne soit pas directement model\u00e9 sur aucun d&rsquo;entre eux.<\/p>\n<p>La RFC utilise la c\u00e9l\u00e8bre analogie des couleurs dans un jeu de cartes pour expliquer son fonctionnement :<\/p>\n<pre><code class=\"language-php\">enum Suit {\ncase Hearts;\ncase Diamonds;\ncase Clubs;\ncase Spades;<\/code><\/pre>\n<p>Ici, l&rsquo;enum <strong>Suit<\/strong> d\u00e9finit quatre valeurs possibles : <strong>Hearts<\/strong>, <strong>Diamonds<\/strong>, <strong>Clubs<\/strong> et <strong>Spades<\/strong>. Vous pouvez acc\u00e9der directement \u00e0 ces valeurs en utilisant la syntaxe : <code>Suit::Hearts<\/code>, <code>Suit::Diamonds<\/code>, <code>Suit::Clubs<\/code>, et <code>Suit::Spades<\/code>.<\/p>\n<p>Cette utilisation peut vous sembler famili\u00e8re, car les enums sont construits au-dessus des classes et des objets. Ils se comportent de mani\u00e8re similaire et ont presque les m\u00eames exigences. Les enums partagent les m\u00eames espaces de noms que les classes, les interfaces et les traits.<\/p>\n<p>Les enums mentionn\u00e9s ci-dessus sont appel\u00e9s <strong>Pure Enums<\/strong>.<\/p>\n<p>Vous pouvez aussi d\u00e9finir des <strong>Enums Backed<\/strong> si vous voulez donner une valeur scalaire \u00e9quivalente \u00e0 n&rsquo;importe quel cas. Cependant, les backed enums ne peuvent avoir qu&rsquo;un seul type, soit <code>int<\/code> soit <code>string<\/code> (jamais les deux).<\/p>\n<pre><code class=\"language-php\">enum Suit: string {\ncase Hearts = 'H';\ncase Diamonds = 'D';\ncase Clubs = 'C';\ncase Spades = 'S';\n}<\/code><\/pre>\n<p>De plus, tous les diff\u00e9rents cas d&rsquo;un backed enum doivent avoir une valeur unique. Et vous ne pouvez jamais m\u00e9langer les enums purs et backed.<\/p>\n<p>La RFC approfondit les m\u00e9thodes d&rsquo;\u00e9num\u00e9ration, les m\u00e9thodes statiques, les constantes, les expressions constantes et bien plus encore. Les couvrir tous d\u00e9passe le cadre de cet article. Vous pouvez vous r\u00e9f\u00e9rer \u00e0 la documentation pour vous familiariser avec toutes ses qualit\u00e9s.<\/p>\n<h3>Le type de retour <code>never<\/code><\/h3>\n<p>PHP 8.1 ajoute un nouvel indice de type de retour appel\u00e9 <code>never<\/code>. C&rsquo;est tr\u00e8s utile pour les fonctions <code>throw<\/code> ou <code>exit<\/code>.<\/p>\n<p>Selon la <a href=\"https:\/\/wiki.php.net\/rfc\/noreturn_type\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a>, les fonctions de redirection d&rsquo;URL <code>exit<\/code> (explicitement ou implicitement) sont un bon exemple de son utilisation :<\/p>\n<pre><code class=\"language-php\">function redirect(string $uri) : never {\n    header('Location : ' . $uri) ;\n    exit() ;\n}\n \nfonction redirectToLoginPage() : never {\n    redirect('\/login');\n}<\/code><\/pre>\n<p>Une fonction d\u00e9clar\u00e9e <code>never<\/code> doit satisfaire trois conditions :<\/p>\n<ul>\n<li>L&rsquo;instruction <code>return<\/code> ne doit pas \u00eatre d\u00e9finie explicitement.<\/li>\n<li>L&rsquo;instruction <code>return<\/code> ne doit pas \u00eatre d\u00e9finie implicitement (par exemple, les instructions <strong>if-else<\/strong>).<\/li>\n<li>Elle doit terminer son ex\u00e9cution avec une d\u00e9claration <code>exit<\/code> (explicitement ou implicitement).<\/li>\n<\/ul>\n<p>L&rsquo;exemple de <a href=\"https:\/\/kinsta.com\/fr\/docs\/hebergement-wordpress\/regles-redirection\/\">redirection d&rsquo;URL<\/a> ci-dessus montre une utilisation \u00e0 la fois explicite et implicite du type de retour <code>never<\/code>.<\/p>\n<p>Le type <code>never<\/code> return partage de nombreuses similitudes avec le type <code>void<\/code> return. Ils garantissent tous deux que la fonction ou la m\u00e9thode ne renvoie pas de valeur. Cependant, il diff\u00e8re en appliquant des r\u00e8gles plus strictes. Par exemple, une fonction d\u00e9clar\u00e9e <code>void<\/code> peut toujours <code>return<\/code> sans valeur explicite, mais vous ne pouvez pas faire la m\u00eame chose avec une fonction d\u00e9clar\u00e9e <code>never<\/code>.<\/p>\n<p>En r\u00e8gle g\u00e9n\u00e9rale, utilisez <code>void<\/code> lorsque vous voulez que PHP continue \u00e0 s&rsquo;ex\u00e9cuter apr\u00e8s l&rsquo;appel de la fonction. Choisissez <code>never<\/code> lorsque vous voulez le contraire.<\/p>\n<p>De plus, <code>never<\/code> est d\u00e9fini comme un type \u00ab inf\u00e9rieur \u00bb. Par cons\u00e9quent, toute m\u00e9thode de classe d\u00e9clar\u00e9e <code>never<\/code> ne peut \u00ab jamais \u00bb changer son type de retour en quelque chose d&rsquo;autre. Cependant, vous pouvez \u00e9tendre une m\u00e9thode d\u00e9clar\u00e9e <code>void<\/code> avec une m\u00e9thode d\u00e9clar\u00e9e <code>never<\/code>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La RFC originale indique le type de retour <code>never<\/code> comme <code>noreturn<\/code>, qui \u00e9tait un type de retour d\u00e9j\u00e0 pris en charge par deux outils d&rsquo;analyse statique de PHP, \u00e0 savoir Psalm et PHPStan. Comme il a \u00e9t\u00e9 propos\u00e9 par les auteurs de Psalm et PHPStan eux-m\u00eames, ils ont conserv\u00e9 sa terminologie. Cependant, en raison des conventions de nommage, l&rsquo;\u00e9quipe PHP a r\u00e9alis\u00e9 un sondage sur <code>noreturn<\/code> vs <code>never<\/code>, dont <code>never<\/code> est sorti vainqueur. Par cons\u00e9quent, pour les versions PHP 8.1+, remplace toujours <code>noreturn<\/code> par <code>never<\/code>.<\/p>\n<\/aside>\n\n<h3>Fibers<\/h3>\n<p>Historiquement, le code PHP a presque toujours \u00e9t\u00e9 un code synchrone. L&rsquo;ex\u00e9cution du code s&rsquo;arr\u00eate jusqu&rsquo;\u00e0 ce que le r\u00e9sultat soit renvoy\u00e9, m\u00eame pour les op\u00e9rations d&rsquo;E\/S. Vous pouvez imaginer pourquoi ce processus peut rendre l&rsquo;ex\u00e9cution du code plus lente.<\/p>\n<p>Il existe de multiples solutions tierces pour surmonter cet obstacle et permettre aux d\u00e9veloppeurs d&rsquo;\u00e9crire du code PHP de mani\u00e8re asynchrone, notamment pour les op\u00e9rations d&rsquo;E\/S simultan\u00e9es. Parmi les exemples populaires, on trouve <a href=\"https:\/\/amphp.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">amphp<\/a>, <a href=\"https:\/\/reactphp.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ReactPHP<\/a> et <a href=\"https:\/\/guzzlephp.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Guzzle<\/a>.<\/p>\n<p>Cependant, il n&rsquo;y a pas de moyen standard de g\u00e9rer de telles instances en PHP. De plus, traiter le code synchrone et asynchrone dans la m\u00eame pile d&rsquo;appels <a href=\"https:\/\/journal.stuffwithstuff.com\/2015\/02\/01\/what-color-is-your-function\/\" target=\"_blank\" rel=\"noopener noreferrer\">entra\u00eene d&rsquo;autres probl\u00e8mes<\/a>.<\/p>\n<p>Les fibers sont la fa\u00e7on dont PHP g\u00e8re le parall\u00e9lisme via les threads virtuels (ou <a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_threads\" target=\"_blank\" rel=\"noopener noreferrer\">threads verts<\/a>). Elle cherche \u00e0 \u00e9liminer la diff\u00e9rence entre le code synchrone et asynchrone en permettant aux fonctions PHP de s&rsquo;interrompre sans affecter l&rsquo;ensemble de la pile d&rsquo;appels.<\/p>\n<p>Voici ce que <em>promet<\/em> <a href=\"https:\/\/wiki.php.net\/rfc\/fibers\" target=\"_blank\" rel=\"noopener noreferrer\">la RFC<\/a>:<\/p>\n<ul>\n<li>Ajout de la prise en charge des fibers \u00e0 PHP.<\/li>\n<li>Introduction d&rsquo;une nouvelle classe Fiber et de la classe de r\u00e9flexion correspondante ReflectionFiber.<\/li>\n<li>Ajout des classes d&rsquo;exception FiberError et FiberExit pour repr\u00e9senter les erreurs.<\/li>\n<li>Les fibers permettent des impl\u00e9mentations d&rsquo;E\/S non bloquantes transparentes des interfaces existantes (PSR-7, Doctrine ORM, etc.). C&rsquo;est parce que l&rsquo;objet placeholder (promesse) est \u00e9limin\u00e9. \u00c0 la place, les fonctions peuvent d\u00e9clarer le type de r\u00e9sultat E\/S au lieu d&rsquo;un objet placeholder qui ne peut pas sp\u00e9cifier de type de r\u00e9solution car PHP ne prend pas en charge les g\u00e9n\u00e9riques.<\/li>\n<\/ul>\n<p>Vous pouvez utiliser Fibers pour d\u00e9velopper des fonctions PHP interruptibles sur toute la pile d&rsquo;ex\u00e9cution, que vous pouvez ensuite utiliser pour mettre en \u0153uvre le multit\u00e2che coop\u00e9ratif en PHP. Comme fibers interrompt toute la <a href=\"https:\/\/kinsta.com\/fr\/docs\/hebergement-wordpress\/surveillance-wordpress\/outil-apm\/#stack-trace\">pile d&rsquo;ex\u00e9cution<\/a>, vous pouvez \u00eatre tranquille en sachant que cela ne nuira pas au reste de votre code.<\/p>\n<figure id=\"attachment_110018\" aria-describedby=\"caption-attachment-110018\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110018 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow-e1637845079600.png\" alt=\"Graphique illustrant le flux d'ex\u00e9cution du code PHP avec Fibers \" width=\"1100\" height=\"894\"><\/a><figcaption id=\"caption-attachment-110018\" class=\"wp-caption-text\">Graphique illustrant le flux d&rsquo;ex\u00e9cution du code PHP avec Fibers (Source : PHP.net).<\/figcaption><\/figure>\n<p>Pour illustrer l&rsquo;utilisation de Fibers, son RFC utilise cet exemple simple :<\/p>\n<pre><code class=\"language-php\">$fiber = new Fiber(function (): void {\n\u00a0 \u00a0 $value = Fiber::suspend('fiber');\n\u00a0 \u00a0 echo \"Value used to resume fiber: \", $value, \"\\n\";\n});\n \n$value = $fiber-&gt;start();\n \necho \"Value from fiber suspending: \", $value, \"\\n\";\n \n$fiber-&gt;resume('test');<\/code><\/pre>\n<p>Vous cr\u00e9ez un \u00ab fiber \u00bb dans le code ci-dessus et vous la suspendez imm\u00e9diatement avec la cha\u00eene <code>fiber<\/code>. L&rsquo;instruction <code>echo<\/code> sert de rep\u00e8re visuel pour la reprise de fiber.<\/p>\n<p>Vous pouvez r\u00e9cup\u00e9rer la valeur de cette cha\u00eene de caract\u00e8res \u00e0 partir de l&rsquo;appel \u00e0 <code>$fiber-&gt;start()<\/code>.<\/p>\n<p>Ensuite, vous reprennez fiber avec la cha\u00eene \u00ab test \u00bb, qui est renvoy\u00e9e par l&rsquo;appel \u00e0 <code>Fiber::suspend()<\/code>. L&rsquo;ex\u00e9cution compl\u00e8te du code donne une sortie qui se lit comme suit :<\/p>\n<pre><code class=\"language-php\">Value from fiber suspending: fiber\nValue used to resume fiber: test<\/code><\/pre>\n<p>C&rsquo;est l&rsquo;exemple de base de PHP Fibers au travail. <a href=\"https:\/\/github.com\/nox7\/async-php-8-io-http\" target=\"_blank\" rel=\"noopener noreferrer\">Voici un autre exemple de Fibers<\/a> qui consiste \u00e0 effectuer sept requ\u00eates GET asynchrones.<\/p>\n<p>Tout \u00e9tant dit et fait, la plupart des d\u00e9veloppeurs PHP n&rsquo;auront jamais affaire \u00e0 Fibers directement. Et la RFC sugg\u00e8re m\u00eame la m\u00eame chose :<\/p>\n<blockquote><p><em>Les fibers sont une fonctionnalit\u00e9 avanc\u00e9e que la plupart des utilisateurs n&rsquo;utiliseront pas directement. Cette fonctionnalit\u00e9 s&rsquo;adresse principalement aux auteurs de biblioth\u00e8ques et de frameworks pour fournir une boucle d&rsquo;\u00e9v\u00e9nements et une API de programmation asynchrone. Les fibers permettent d&rsquo;int\u00e9grer l&rsquo;ex\u00e9cution de code asynchrone de fa\u00e7on transparente dans le code synchrone \u00e0 n&rsquo;importe quel endroit sans avoir \u00e0 modifier la pile d&rsquo;appels de l&rsquo;application ou \u00e0 ajouter du code passe-partout.<\/em><\/p>\n<p><em>L&rsquo;API Fiber n&rsquo;est pas cens\u00e9e \u00eatre utilis\u00e9e directement dans le code au niveau de l&rsquo;application. Les Fibers fournissent une API de contr\u00f4le de flux de base et de bas niveau pour cr\u00e9er des abstractions de plus haut niveau qui sont ensuite utilis\u00e9es dans le code de l&rsquo;application.<\/em><\/p><\/blockquote>\n<p>Compte tenu de ses avantages en termes de performances, vous pouvez vous attendre \u00e0 ce que les biblioth\u00e8ques et les frameworks PHP tirent parti de cette nouvelle fonctionnalit\u00e9. Il sera int\u00e9ressant de voir comment ils impl\u00e9mentent Fibers dans leur \u00e9cosyst\u00e8me.<\/p>\n<h3>Nouvelles propri\u00e9t\u00e9s <code>readonly<\/code><\/h3>\n<p>PHP 8.1 ajoute la prise en charge des propri\u00e9t\u00e9s <code>readonly<\/code>. Elles ne peuvent \u00eatre initialis\u00e9es qu&rsquo;une seule fois \u00e0 partir du scope o\u00f9 elles sont d\u00e9clar\u00e9es. Une fois initialis\u00e9es, vous ne pouvez jamais modifier leur valeur. Si vous le faisiez, vous d\u00e9clencheriez une exception <strong>Error<\/strong>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/readonly_properties_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Sa RFC<\/a> est la suivante :<\/p>\n<blockquote><p><strong><em>readonly<\/em><\/strong><em> ne peut \u00eatre initialis\u00e9e qu&rsquo;une seule fois, et uniquement \u00e0 partir du scope o\u00f9 elle a \u00e9t\u00e9 d\u00e9clar\u00e9e. Toute autre affectation ou modification de la propri\u00e9t\u00e9 entra\u00eenera une exception d&rsquo;erreur.<\/em><\/p><\/blockquote>\n<p>Voici un exemple de la fa\u00e7on dont vous pouvez l&rsquo;utiliser :<\/p>\n<pre><code class=\"language-php\">class Test {\n\u00a0 \u00a0 public readonly string $kinsta;\n \n\u00a0 \u00a0 public function __construct(string $kinsta) {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Legal initialization.\n\u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;kinsta = $kinsta;\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Une fois initialis\u00e9e, il n&rsquo;y a pas de retour en arri\u00e8re possible. Le fait que cette fonctionnalit\u00e9 soit int\u00e9gr\u00e9e \u00e0 PHP r\u00e9duit consid\u00e9rablement le code passe-partout qui est souvent utilis\u00e9 pour activer cette fonctionnalit\u00e9.<\/p>\n<p>La propri\u00e9t\u00e9 <code>readonly<\/code> offre une solide garantie d&rsquo;immuabilit\u00e9, tant \u00e0 l&rsquo;int\u00e9rieur qu&rsquo;\u00e0 l&rsquo;ext\u00e9rieur de la classe. Le code ex\u00e9cut\u00e9 entre les deux n&rsquo;a aucune importance. L&rsquo;appel d&rsquo;une propri\u00e9t\u00e9 <code>readonly<\/code> renverra toujours la m\u00eame valeur.<\/p>\n<p>Cependant, l&rsquo;utilisation de la propri\u00e9t\u00e9 <code>readonly<\/code> peut ne pas \u00eatre id\u00e9ale dans certains cas d&rsquo;utilisation sp\u00e9cifiques. Par exemple, vous ne pouvez les utiliser qu&rsquo;\u00e0 c\u00f4t\u00e9 d&rsquo;une <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#typed-properties\">propri\u00e9t\u00e9 typ\u00e9e<\/a>, car les d\u00e9clarations sans type sont implicitement <code>null<\/code> et ne peuvent pas \u00eatre <code>readonly<\/code>.<\/p>\n<p>En outre, d\u00e9finir une propri\u00e9t\u00e9 <code>readonly<\/code> ne rend pas les objets immuables. La propri\u00e9t\u00e9 <code>readonly<\/code> conservera le m\u00eame objet, mais cet objet lui-m\u00eame peut changer.<\/p>\n<p>Un autre probl\u00e8me mineur avec cette propri\u00e9t\u00e9 est que vous ne pouvez pas la cloner. Il existe d\u00e9j\u00e0 une <a href=\"https:\/\/stitcher.io\/blog\/cloning-readonly-properties-in-php-81\" target=\"_blank\" rel=\"noopener noreferrer\">solution de contournement pour ce cas d&rsquo;utilisation particulier<\/a>. Cherchez-la si n\u00e9cessaire.<\/p>\n<h3>D\u00e9finir des constantes de classe <code>final<\/code><\/h3>\n<p>Depuis PHP 8.0, vous pouvez remplacer les constantes de classe par ses classes filles. Cela est d\u00fb \u00e0 la fa\u00e7on dont l&rsquo;h\u00e9ritage est impl\u00e9ment\u00e9 en PHP.<\/p>\n<p>Voici un exemple de la fa\u00e7on dont vous pouvez remplacer la valeur d&rsquo;une constante pr\u00e9c\u00e9demment d\u00e9clar\u00e9e :<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n    public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n    public const M = \"meow\";\n}  <\/code><\/pre>\n<p>Maintenant, si les vaches veulent \u00eatre plus strictes avec le comportement des chats (au moins avec les constantes), elles peuvent le faire avec le nouveau modificateur <code>final<\/code> de PHP 8.1.<\/p>\n<p>Une fois que vous avez d\u00e9clar\u00e9 une constante comme \u00e9tant <code>final<\/code>, cela signifie que.<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n\u00a0 \u00a0 final public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n\u00a0 \u00a0 public const M = \"meow\";\n}\n \n\/\/ Fatal error: Meow::M cannot override final constant Moo::M<\/code><\/pre>\n<p>Vous pouvez en savoir plus \u00e0 ce sujet dans la RFC PHP sur <a href=\"https:\/\/wiki.php.net\/rfc\/final_class_const\" target=\"_blank\" rel=\"noopener noreferrer\">les constantes de classe finales<\/a>.<\/p>\n<h3>Nouvelles fonctions <code>fsync()<\/code> et <code>fdatasync()<\/code><\/h3>\n<p>PHP 8.1 ajoute deux nouvelles fonctions de syst\u00e8me de fichiers appel\u00e9es <code>fsync()<\/code> et <code>fdatasync()<\/code>. Elles sembleront famili\u00e8res \u00e0 ceux qui sont habitu\u00e9s aux <a href=\"https:\/\/linux.die.net\/man\/2\/fsync\" target=\"_blank\" rel=\"noopener noreferrer\">fonctions Linux du m\u00eame nom<\/a>. C&rsquo;est parce qu&rsquo;elles sont apparent\u00e9es, simplement impl\u00e9ment\u00e9es pour PHP.<\/p>\n<p>En fait, cet ajout s&rsquo;est fait attendre depuis longtemps. PHP est l&rsquo;un des rares langages de programmation majeurs qui n&rsquo;a toujours pas impl\u00e9ment\u00e9 <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\" target=\"_blank\" rel=\"noopener noreferrer\">fsync() et fdatasync()<\/a>, c&rsquo;est-\u00e0-dire <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\" target=\"_blank\" rel=\"noopener noreferrer\">jusqu&rsquo;\u00e0 PHP 8.1<\/a>.<\/p>\n<p>La fonction <code>fsync()<\/code> est similaire \u00e0 la fonction <code>fflush()<\/code> existante de PHP, mais elle diff\u00e8re consid\u00e9rablement sur un point. Alors que <code>fflush()<\/code> vide les tampons internes de l&rsquo;application dans le syst\u00e8me d&rsquo;exploitation, <code>fsync()<\/code> va plus loin et s&rsquo;assure que les tampons internes sont vid\u00e9s dans le <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-ssd\/\">stockage<\/a> physique. Cela garantit une \u00e9criture compl\u00e8te et persistante afin que vous puissiez r\u00e9cup\u00e9rer les donn\u00e9es m\u00eame apr\u00e8s une panne de l&rsquo;application ou du syst\u00e8me.<\/p>\n<p>Voici un exemple de la fa\u00e7on dont vous pouvez l&rsquo;utiliser.<\/p>\n<pre><code class=\"language-php\">$doc = 'kinsta.txt';\n\n$kin = fopen($doc, 'ki');\nfwrite($kin, 'info doc');\nfwrite($kin, '\\r\\n');\nfwrite($kin, 'more info');\n\nfsync($kin);\nfclose($kin);<\/code><\/pre>\n<p>L&rsquo;ajout de l&rsquo;appel <code>fsync()<\/code> \u00e0 la fin garantit que toutes les donn\u00e9es contenues dans le tampon interne de PHP ou du syst\u00e8me d&rsquo;exploitation sont \u00e9crites dans le stockage. Toutes les autres ex\u00e9cutions de code sont bloqu\u00e9es jusqu&rsquo;\u00e0 ce moment-l\u00e0.<\/p>\n<p>Sa fonction apparent\u00e9e est <code>fdatasync()<\/code>. Utilisez-la pour synchroniser les donn\u00e9es mais pas n\u00e9cessairement les m\u00e9tadonn\u00e9es. Pour les donn\u00e9es dont les m\u00e9tadonn\u00e9es ne sont pas essentielles, cet appel de fonction rend le processus d&rsquo;\u00e9criture un peu plus rapide.<\/p>\n<p>Cependant, vous devez savoir que PHP 8.1 ne prend pas encore totalement en charge <code>fdatasync()<\/code> sous Windows. Elle agit simplement comme un alias de <code>fsync()<\/code>. Sous POSIX, <code>fdatasync()<\/code> est correctement impl\u00e9ment\u00e9.<\/p>\n<h3>Nouvelle fonction <code>array_is_list()<\/code><\/h3>\n<p>Les tableaux PHP peuvent contenir \u00e0 la fois des cl\u00e9s enti\u00e8res et des cha\u00eenes de caract\u00e8res. Cela signifie que vous pouvez les utiliser pour plusieurs choses, notamment des listes, des tables de hachage, des dictionnaires, des collections, des piles, des files d&rsquo;attente et bien plus encore. Vous pouvez m\u00eame avoir des tableaux dans des tableaux, cr\u00e9ant ainsi des tableaux multidimensionnels.<\/p>\n<p>Vous pouvez v\u00e9rifier efficacement si une entr\u00e9e particuli\u00e8re est un tableau, mais il n&rsquo;est pas si facile de v\u00e9rifier s&rsquo;il manque des offsets de tableau, si les cl\u00e9s ne sont pas dans l&rsquo;ordre, etc. En bref, vous ne pouvez pas v\u00e9rifier rapidement si un tableau est une liste.<\/p>\n<p>La <a href=\"https:\/\/wiki.php.net\/rfc\/is_list\" target=\"_blank\" rel=\"noopener noreferrer\">fonction array_is_list()<\/a> v\u00e9rifie si les cl\u00e9s d&rsquo;un tableau sont en ordre s\u00e9quentiel \u00e0 partir de <code>0<\/code>, et sans aucun vide. Si toutes les conditions sont remplies, elle renvoie <code>true<\/code>. Par d\u00e9faut, elle renvoie \u00e9galement <code>true<\/code> pour les tableaux vides.<\/p>\n<p>Voici quelques exemples d&rsquo;utilisation de la fonction avec des conditions <code>true<\/code> et <code>false<\/code> remplies :<\/p>\n<pre><code class=\"language-php\">\/\/ true array_is_list() examples\narray_is_list([]); \/\/ true\narray_is_list([1, 2, 3]); \/\/ true\narray_is_list(['cats', 2, 3]); \/\/ true\narray_is_list(['cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 1 =&gt; 'dogs']); \/\/ true \n\n\/\/ false array_is_list() examples \narray_is_list([1 =&gt; 'cats', 'dogs']); \/\/ as first key isn't 0\narray_is_list([1 =&gt; 'cats', 0 =&gt; 'dogs']); \/\/ keys are out of order\narray_is_list([0 =&gt; 'cats', 'bark' =&gt; 'dogs']); \/\/ non-integer keys\narray_is_list([0 =&gt; 'cats', 2 =&gt; 'dogs']); \/\/ gap in between keys <\/code><\/pre>\n<p>Une liste de tableaux PHP dont les cl\u00e9s ne sont pas dans l&rsquo;ordre est une <a href=\"https:\/\/kinsta.com\/fr\/blog\/securite-wordpress\/#2-use-latest-php-version\">source potentielle de bogues<\/a>. Utiliser cette fonction pour imposer un respect strict des exigences de la <strong>liste<\/strong> avant de passer \u00e0 l&rsquo;ex\u00e9cution du code est un excellent ajout \u00e0 PHP.<\/p>\n<h3>Nouvelles fonctions Sodium XChaCha20<\/h3>\n<p>Sodium est une biblioth\u00e8que cryptographique moderne et facile \u00e0 utiliser pour le cryptage, le d\u00e9cryptage, le hachage de <a href=\"https:\/\/kinsta.com\/fr\/blog\/gestionnaires-mots-passe\/\">mots de passe<\/a>, les signatures et bien plus encore. Le <a href=\"https:\/\/pecl.php.net\/package\/libsodium\" target=\"_blank\" rel=\"noopener noreferrer\">paquet PECL libsodium<\/a> ajoute un wrapper pour Sodium afin que les d\u00e9veloppeurs PHP puissent l&rsquo;utiliser.<\/p>\n<p>M\u00eame les <a href=\"https:\/\/doc.libsodium.org\/libsodium_users\" target=\"_blank\" rel=\"noopener noreferrer\">grandes entreprises technologiques<\/a> comme Facebook, Discord, Malwarebytes et Valve utilisent libsodium pour s\u00e9curiser leurs utilisateurs avec des connexions rapides et s\u00fbres.<\/p>\n<p>libsodium prend en charge l&rsquo;<a href=\"https:\/\/www.cryptopp.com\/wiki\/XChaCha20\" target=\"_blank\" rel=\"noopener noreferrer\">algorithme de cryptage XChaCha20<\/a> pour crypter et d\u00e9crypter les donn\u00e9es, notamment pour le cryptage des flux. De m\u00eame, l&rsquo;extension libsodium de PECL prend d\u00e9j\u00e0 en charge XChaCha20, mais uniquement avec le code d&rsquo;authentification des messages Poly1305.<\/p>\n<p>De nombreuses applications PHP utilisent directement XChaCha20 pour le chiffrement des flux. Pour faciliter les choses, \u00e0 partir de PHP 8.1, vous aurez trois nouvelles fonctions pour crypter ou d\u00e9crypter des donn\u00e9es avec XChaCha20 sans que l&rsquo;authentification soit impliqu\u00e9e. Ce mode est appel\u00e9 \u00ab mode d\u00e9tach\u00e9 \u00bb<\/p>\n<p>Les fonctions XChaCha20 nouvellement introduites sont :<\/p>\n<ul>\n<li><code>sodium_crypto_stream_xchacha20_keygen<\/code>: Renvoie une cl\u00e9 al\u00e9atoire s\u00e9curis\u00e9e \u00e0 utiliser avec sodium_crypto_stream_xchacha20.<\/li>\n<li><code>sodium_crypto_stream_xchacha20<\/code>: D\u00e9veloppe la cl\u00e9 et le nonce en un flux de cl\u00e9s d&rsquo;octets pseudo-al\u00e9atoires.<\/li>\n<li><code>sodium_crypto_stream_xchacha20_xor<\/code>: Chiffre un message en utilisant un nonce et une cl\u00e9 secr\u00e8te (pas d&rsquo;authentification).<\/li>\n<\/ul>\n<p>De plus, il y a deux nouvelles constantes PHP d\u00e9finies dans l&rsquo;espace de noms global :<\/p>\n<ul>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES<\/code> (assign\u00e9 <strong>32<\/strong>)<\/li>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES<\/code> (assign\u00e9 <strong>24<\/strong>)<\/li>\n<\/ul>\n<p>Utilisez-le cependant avec prudence. Puisqu&rsquo;il n&rsquo;y a pas d&rsquo;authentification, l&rsquo;op\u00e9ration de d\u00e9cryptage est vuln\u00e9rable aux attaques courantes par texte chiffr\u00e9.<\/p>\n<p>Vous pouvez en savoir plus sur son utilisation et ses exigences sur la <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6868\" target=\"_blank\" rel=\"noopener noreferrer\">page GitHub<\/a>.<\/p>\n<h3>Nouvelle classe IntlDatePatternGenerator<\/h3>\n<p>La biblioth\u00e8que ICU sous-jacente de PHP prend en charge la cr\u00e9ation de <a href=\"https:\/\/kinsta.com\/fr\/blog\/plugin-calendrier-wordpress\/\">formats de date et d&rsquo;heure<\/a> localis\u00e9s, mais elle n&rsquo;est pas enti\u00e8rement personnalisable.<\/p>\n<p>Par exemple, si vous voulez cr\u00e9er des formats de donn\u00e9es et d&rsquo;heure sp\u00e9cifiques \u00e0 une r\u00e9gion jusqu&rsquo;\u00e0 PHP 8.0, vous pouvez utiliser la <a href=\"https:\/\/www.php.net\/manual\/en\/class.intldateformatter.php\" target=\"_blank\" rel=\"noopener noreferrer\">constante pr\u00e9d\u00e9finie IntlDateFormatter<\/a> pour le faire de 6 fa\u00e7ons :<\/p>\n<ul>\n<li><strong><code>IntlDateFormatter::LONG<\/code><\/strong>: Plus long, comme 10 novembre <strong>2017<\/strong> ou <strong>11:22:33pm<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::MEDIUM<\/code><\/strong>: Un peu plus court, comme Nov 10, <strong>2017<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::SHORT<\/code><\/strong>: Juste num\u00e9rique, comme <strong>10\/11\/17<\/strong> ou <strong>11:22pm<\/strong><\/li>\n<\/ul>\n<p>Chacune d&rsquo;entre elles poss\u00e8de \u00e9galement ses propres variantes <code>RELATIVE_<\/code>, qui d\u00e9finissent le formatage de la date dans une plage limit\u00e9e avant ou apr\u00e8s la date actuelle. En PHP, les valeurs sont <strong>yesterday<\/strong>, <strong>today<\/strong> et <strong>tomorrow<\/strong>.<\/p>\n<p>Disons que vous voulez utiliser la version longue pour l&rsquo;ann\u00e9e et la version courte pour le mois, comme <strong>10\/11\/2017<\/strong>. Depuis PHP 8.0, vous ne pouvez pas.<\/p>\n<p>Dans PHP 8.1+, vous pouvez sp\u00e9cifier les formats \u00e0 utiliser pour la date, le mois et l&rsquo;heure avec la nouvelle classe <strong>IntlDatePatternGenerator<\/strong>. Vous pouvez laisser l&rsquo;ordre exact de ces composants au formateur.<\/p>\n<p>Vous devez noter que m\u00eame si cette classe ne contient que le mot <strong>Date<\/strong>, elle est coh\u00e9rente avec le <strong>DateTimePatternGenerator<\/strong> d&rsquo;ICU. Cela signifie que vous pouvez aussi l&rsquo;utiliser pour cr\u00e9er des formats d&rsquo;heure flexibles. Pour simplifier l&rsquo;attribution des noms, l&rsquo;\u00e9quipe PHP a choisi d&rsquo;utiliser le terme plus court <strong>IntlDatePatternGenerator<\/strong>.<\/p>\n<p>Voici un exemple tir\u00e9 directement de <a href=\"https:\/\/wiki.php.net\/rfc\/intldatetimepatterngenerator\" target=\"_blank\" rel=\"noopener noreferrer\">sa RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$skeleton = \"YYYYMMdd\";\n \n$today = \\DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');\n \n$dtpg = new \\IntlDatePatternGenerator(\"de_DE\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton);\necho \"de: \", \\IntlDateFormatter::formatObject($today, $pattern, \"de_DE\"), \"\\n\";\n \n$dtpg = new \\IntlDatePatternGenerator(\"en_US\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton), \"\\n\";\necho \"en: \", \\IntlDateFormatter::formatObject($today, $pattern, \"en_US\"), \"\\n\";\n \n\/*\nde: 24.04.2021\nen: 04\/24\/2021\n*\/<\/code><\/pre>\n<p>Dans le code ci-dessus, la variable <strong>skeleton<\/strong> d\u00e9finit les formats de date ou d&rsquo;heure particuliers \u00e0 utiliser. Cependant, le formateur g\u00e8re l&rsquo;ordre du r\u00e9sultat final.<\/p>\n<h3>Prise en charge du format d&rsquo;image AVIF<\/h3>\n<p>AVIF, ou AV1 Image File Format, est un <a href=\"https:\/\/kinsta.com\/fr\/blog\/types-fichier-image\/\">format d&rsquo;image<\/a> libre de droits relativement nouveau bas\u00e9 sur le format de codage vid\u00e9o AV1. Outre le fait qu&rsquo;il offre une compression plus \u00e9lev\u00e9e (et donc des tailles de fichiers plus petites), il prend \u00e9galement en charge plusieurs fonctionnalit\u00e9s telles que la transparence, le HDR, et plus encore.<\/p>\n<p>Le format AVIF n&rsquo;a \u00e9t\u00e9 <a href=\"https:\/\/aomediacodec.github.io\/av1-avif\/\" target=\"_blank\" rel=\"noopener noreferrer\">normalis\u00e9<\/a> que <a href=\"https:\/\/aomediacodec.github.io\/av1-avif\/\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9cemment<\/a> (8 juin 2021). Cela a ouvert la voie aux navigateurs, tels que Chrome 85+ et Firefox 86+, qui ajoutent la prise en charge des images AVIF.<\/p>\n<p>L&rsquo;extension GD et de traitement des images de PHP 8.1 ajoute la prise en charge des images AVIF.<\/p>\n<p>Cependant, pour inclure cette fonctionnalit\u00e9, vous devez compiler l&rsquo;extension GD avec la prise en charge d&rsquo;AVIF. Vous pouvez le faire en ex\u00e9cutant les commandes ci-dessous.<\/p>\n<p>Pour Debian\/Ubuntu :<\/p>\n<pre><code class=\"language-bash\">apt install libavif-dev<\/code><\/pre>\n<p>Pour Fedora\/RHEL :<\/p>\n<pre><code class=\"language-bash\">dnf install libavif-devel<\/code><\/pre>\n<p>Cela permettra d&rsquo;installer toutes les derni\u00e8res d\u00e9pendances. Ensuite, vous pouvez compiler le support AVIF en ex\u00e9cutant le flag <code>--with-avif<\/code> avec le script <code>.\/configure<\/code>.<\/p>\n<pre><code class=\"language-bash\">.\/buildconf --force\n.\/configure --enable-gd --with-avif<\/code><\/pre>\n<p>Si vous d\u00e9marrez un nouvel environnement \u00e0 partir de z\u00e9ro, vous pouvez aussi activer d&rsquo;autres extensions PHP ici.<\/p>\n<p>Une fois install\u00e9, vous pouvez tester si la prise en charge d&rsquo;AVIF est activ\u00e9e en ex\u00e9cutant la commande suivante dans votre terminal PHP :<\/p>\n<pre><code class=\"language-bash\">php -i | grep AVIF<\/code><\/pre>\n<p>Si vous avez install\u00e9 AVIF correctement, vous verrez le r\u00e9sultat suivant :<\/p>\n<pre><code class=\"language-bash\">Support AVIF =&gt; enabled<\/code><\/pre>\n<p>Vous pouvez aussi utiliser l&rsquo;appel <code>gd_info()<\/code> pour r\u00e9cup\u00e9rer une liste des fonctionnalit\u00e9s de GD, y compris si la fonctionnalit\u00e9 de <strong>soutien AVIF<\/strong> est activ\u00e9e.<\/p>\n<p>Cette extension GD PHP 8.1 mise \u00e0 jour ajoute \u00e9galement deux nouvelles fonctions pour travailler avec les images AVIF : <code>imagecreatefromavif<\/code> et <code>imageavif<\/code>. Elles fonctionnent de mani\u00e8re similaire \u00e0 leurs homologues JPEG et PNG.<\/p>\n<p>La fonction <code>imagecreatefromavif<\/code> renvoie une instance GdImage \u00e0 partir d&rsquo;une image AVIF donn\u00e9e. Vous pouvez ensuite utiliser cette instance pour modifier ou convertir l&rsquo;image.<\/p>\n<p>L&rsquo;autre fonction <code>imageavif<\/code> produit le fichier image AVIF. Par exemple, vous pouvez l&rsquo;utiliser pour convertir un JPEG en AVIF :<\/p>\n<pre><code class=\"language-php\">$image = imagecreatefromjpeg('image.jpeg');\nimageavif($image, 'image.avif');<\/code><\/pre>\n<p>Vous pouvez en savoir plus sur cette nouvelle fonction sur <a href=\"https:\/\/github.com\/php\/php-src\/pull\/7026\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a>.<\/p>\n<h3>Nouvelle cl\u00e9 <code>$_FILES : full_path<\/code> pour les t\u00e9l\u00e9versements de r\u00e9pertoires<\/h3>\n<p>PHP g\u00e8re un grand nombre de variables pr\u00e9d\u00e9finies pour suivre diverses choses. L&rsquo;une d&rsquo;entre elles est la <a href=\"https:\/\/www.php.net\/manual\/en\/reserved.variables.files.php\" target=\"_blank\" rel=\"noopener noreferrer\"> variable $_FILES<\/a> qui contient un tableau associatif d&rsquo;\u00e9l\u00e9ments t\u00e9l\u00e9vers\u00e9s via la m\u00e9thode HTTP POST.<\/p>\n<p>La plupart des navigateurs modernes prennent en charge le <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/input\/file#htmlattrdefwebkitdirectory_non-standard_inline\" target=\"_blank\" rel=\"noopener noreferrer\">t\u00e9l\u00e9versement d&rsquo;un r\u00e9pertoire entier<\/a> avec les champs de <a href=\"https:\/\/kinsta.com\/fr\/blog\/comment-envoyer-fichier-html-vers-wordpress\/\">t\u00e9l\u00e9versement de fichiers HTML<\/a>. M\u00eame PHP &lt;8.1 prenait en charge cette fonctionnalit\u00e9, mais avec une grosse r\u00e9serve. Vous ne pouviez pas t\u00e9l\u00e9verser un r\u00e9pertoire avec sa structure de r\u00e9pertoire exacte ou ses chemins relatifs car PHP ne transmettait pas ces informations au tableau <code>$_FILES<\/code>.<\/p>\n<p>Cela change dans PHP 8.1 avec l&rsquo;ajout d&rsquo;une nouvelle cl\u00e9 nomm\u00e9e <code>full_path<\/code> au tableau <code>$_FILES<\/code>. Gr\u00e2ce \u00e0 ces nouvelles donn\u00e9es, vous pouvez stocker des chemins relatifs ou dupliquer la structure exacte du r\u00e9pertoire sur le serveur.<\/p>\n<p>Vous pouvez tester ces informations en sortant le tableau <code>$FILES<\/code> \u00e0 l&rsquo;aide de la commande <code>var_dump($_FILES) ;<\/code>.<\/p>\n<p>Cependant, faites preuve de prudence si vous utilisez cette fonctionnalit\u00e9. Assurez-vous de vous prot\u00e9ger contre les <a href=\"https:\/\/php.watch\/versions\/8.1\/$_FILES-full-path#security-hardening\" target=\"_blank\" rel=\"noopener noreferrer\">attaques standard de t\u00e9l\u00e9versement de fichiers<\/a>.<\/p>\n<h3>Prise en charge du d\u00e9ballage des tableaux pour les tableaux \u00e0 cl\u00e9 de caract\u00e8res<\/h3>\n<p>PHP 7.4 a ajout\u00e9 la <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#array-spread-operator\">prise en charge du d\u00e9ballage des tableaux<\/a> avec l&rsquo;op\u00e9rateur d&rsquo;\u00e9talement de tableau (<strong>&#8230;<\/strong>). Il s&rsquo;agit d&rsquo;une alternative plus rapide \u00e0 l&rsquo;utilisation de la fonction <code>array_merge()<\/code>. Cependant, cette fonctionnalit\u00e9 \u00e9tait limit\u00e9e aux tableaux \u00e0 cl\u00e9s num\u00e9riques car le d\u00e9ballage des tableaux \u00e0 cl\u00e9s de type cha\u00eene provoquait des conflits lors de la fusion des tableaux avec des cl\u00e9s dupliqu\u00e9es.<\/p>\n<p>Cependant, PHP 8 a ajout\u00e9 la <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#named-arguments\">prise en charge des arguments nomm\u00e9s<\/a>, supprimant ainsi cette limitation. Par cons\u00e9quent, le d\u00e9ballage de tableaux prend d\u00e9sormais en charge les tableaux \u00e0 cl\u00e9 de type cha\u00eene de caract\u00e8res en utilisant la m\u00eame syntaxe :<\/p>\n<pre><code class=\"language-php\">$array = [...$array1, ...$array2];<\/code><\/pre>\n<p>Cet <a href=\"https:\/\/wiki.php.net\/rfc\/array_unpacking_string_keys\" target=\"_blank\" rel=\"noopener noreferrer\">exemple de RFC<\/a> illustre comment la fusion de tableaux avec des cl\u00e9s de cha\u00eene dupliqu\u00e9es est g\u00e9r\u00e9e en PHP 8.1 :<\/p>\n<pre><code class=\"language-php\">$array1 = [\"a\" =&gt; 1];\n$array2 = [\"a\" =&gt; 2];\n$array = [\"a\" =&gt; 0, ...$array1, ...$array2];\nvar_dump($array) ; \/\/ [\"a\" =&gt; 2]<\/code><\/pre>\n<p>Ici, la cl\u00e9 de cha\u00eene \u00ab a \u00bb appara\u00eet trois fois avant la fusion via le d\u00e9ballage du tableau. Mais seule sa derni\u00e8re valeur appartenant \u00e0 <code>$array2<\/code> est gagnante.<\/p>\n<h3>Notation num\u00e9rique octale explicite<\/h3>\n<p>PHP prend en charge diff\u00e9rents syst\u00e8mes num\u00e9riques, notamment d\u00e9cimal (base-10), binaire (base-2), octal (base-8) et hex (base-16). Le syst\u00e8me num\u00e9rique d\u00e9cimal est le syst\u00e8me par d\u00e9faut.<\/p>\n<p>Si vous voulez utiliser un autre syst\u00e8me num\u00e9ral, vous devrez pr\u00e9fixer chaque nombre avec un pr\u00e9fixe standard :<\/p>\n<ul>\n<li><strong>Hex :<\/strong> Pr\u00e9fixe <code>0x<\/code>. (par exemple, 17 = <code>0x11<\/code>)<\/li>\n<li><strong>Binaire :<\/strong> Pr\u00e9fixe <code>0b<\/code>. (par exemple, 3 = <code>0b11<\/code>)<\/li>\n<li><strong>Octal :<\/strong> Pr\u00e9fixe <code>0<\/code>. (par ex. 9 = <code>011<\/code>)<\/li>\n<\/ul>\n<p>Vous pouvez voir comment le pr\u00e9fixe du syst\u00e8me num\u00e9ral octal diff\u00e8re des autres. Pour normaliser cette pr\u00e9occupation, de nombreux langages de programmation ajoutent la prise en charge d&rsquo;une notation num\u00e9rale octale explicite : <code>0o<\/code> ou <code>0O<\/code>.<\/p>\n<p>\u00c0 partir de PHP 8.1, vous pouvez \u00e9crire l&rsquo;exemple ci-dessus (c&rsquo;est-\u00e0-dire le nombre 9 en base 10) dans le syst\u00e8me num\u00e9rique octal sous la forme <code>0o11<\/code> ou <code>0O11<\/code>.<\/p>\n<pre><code class=\"language-php\">0o16 === 14; \/\/ true\n0o123 === 83; \/\/ true\n \n0O16 === 14; \/\/ true\n0O123 === 83; \/\/ true\n \n016 === 0o16; \/\/ true\n016 === 0O16; \/\/ true<\/code><\/pre>\n<p>De plus, cette nouvelle fonctionnalit\u00e9 fonctionne \u00e9galement avec le <a href=\"https:\/\/wiki.php.net\/rfc\/numeric_literal_separator\" target=\"_blank\" rel=\"noopener noreferrer\">s\u00e9parateur num\u00e9rique litt\u00e9ral underscore<\/a> introduit dans PHP 7.4.<\/p>\n<p>Pour en savoir plus sur cette nouvelle fonctionnalit\u00e9 de PHP 8.1, consultez <a href=\"https:\/\/wiki.php.net\/rfc\/explicit_octal_notation\" target=\"_blank\" rel=\"noopener noreferrer\">sa RFC<\/a>.<\/p>\n<h3>Prise en charge des algorithmes de hachage MurmurHash3 et xxHash<\/h3>\n<p>PHP 8.1 ajoute la prise en charge des algorithmes de hachage MurmurHash3 et xxHash. Ils ne sont pas con\u00e7us pour une utilisation cryptographique, mais ils offrent tout de m\u00eame un caract\u00e8re al\u00e9atoire, une dispersion et une unicit\u00e9 de sortie impressionnants.<\/p>\n<p>Ces <a href=\"https:\/\/php.watch\/articles\/php-hash-benchmark\" target=\"_blank\" rel=\"noopener noreferrer\">nouveaux algorithmes de hachage sont plus rapides<\/a> que la plupart des algorithmes de hachage existants de PHP. En fait, certaines variantes de ces algorithmes de hachage sont plus rapides que le d\u00e9bit de la RAM.<\/p>\n<p>Comme PHP 8.1 ajoute \u00e9galement la prise en charge de la d\u00e9claration de param\u00e8tres <code>$options<\/code> sp\u00e9cifiques aux algorithmes, vous pouvez faire de m\u00eame avec ces nouveaux algorithmes. La valeur par d\u00e9faut de ce nouvel argument est <code>[]<\/code>. Ainsi, cela n&rsquo;affectera aucune de nos fonctions de hachage existantes.<\/p>\n<p>Vous pouvez en savoir plus sur ces nouvelles fonctionnalit\u00e9s de PHP 8.1 sur leurs pages GitHub : <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6059\" target=\"_blank\" rel=\"noopener noreferrer\">MurmurHash3<\/a>, <a href=\"https:\/\/php.watch\/versions\/8.1\/xxHash\" target=\"_blank\" rel=\"noopener noreferrer\">xxHash<\/a>, <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6400\" target=\"_blank\" rel=\"noopener noreferrer\">$options sp\u00e9cifiques aux algorithmes<\/a>.<\/p>\n<h3>Prise en charge de DNS-over-HTTPS (DoH)<\/h3>\n<p>DNS-over-HTTPS (DoH) est un protocole pour la <a href=\"https:\/\/kinsta.com\/fr\/blog\/que-sont-les-dns\/\">r\u00e9solution DNS<\/a> via le protocole HTTPS. En utilisant HTTPS pour chiffrer les donn\u00e9es entre le client et le r\u00e9solveur DNS, DoH augmente la confidentialit\u00e9 et la s\u00e9curit\u00e9 des utilisateurs en emp\u00eachant les attaques MitM.<\/p>\n<p>\u00c0 partir de PHP 8.1, vous pouvez <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6612\" target=\"_blank\" rel=\"noopener noreferrer\">utiliser l&rsquo;extension Curl pour sp\u00e9cifier un serveur DoH<\/a>. Elle n\u00e9cessite que PHP soit compil\u00e9 avec les versions <strong>libcurl<\/strong> 7.62+. Ce n&rsquo;est pas un probl\u00e8me pour la plupart des syst\u00e8mes d&rsquo;exploitation populaires, y compris les distributions Linux, car elles incluent souvent Curl 7.68+.<\/p>\n<p>Vous pouvez configurer l&rsquo;URL du serveur DoH en sp\u00e9cifiant l&rsquo;option <code>CURLOPT_DOH_URL<\/code>.<\/p>\n<pre><code class=\"language-php\">$doh = curl_init('https:\/\/kinsta.com');\ncurl_setopt($doh, CURLOPT_DOH_URL, 'https:\/\/dns.google\/dns-query');\ncurl_exec($doh);<\/code><\/pre>\n<p>Dans l&rsquo;exemple ci-dessus, nous avons utilis\u00e9 le serveur DNS public de Google. Remarquez \u00e9galement l&rsquo;utilisation de <code>https:\/\/<\/code> dans toutes les URL utilis\u00e9es. Assurez-vous de configurer cela parfaitement car il n&rsquo;y a pas de serveur DNS par d\u00e9faut auquel se rabattre dans Curl.<\/p>\n<p>Vous pouvez aussi choisir parmi <a href=\"https:\/\/github.com\/curl\/curl\/wiki\/DNS-over-HTTPS\" target=\"_blank\" rel=\"noopener noreferrer\">une liste de serveurs DoH publics<\/a> inclus dans la documentation de Curl.<\/p>\n<p>De plus, la <a href=\"https:\/\/curl.se\/libcurl\/c\/CURLOPT_DOH_URL.html\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence CURLOPT_DOH_URL<\/a> de la documentation Curl explique en d\u00e9tail comment utiliser ses diff\u00e9rents arguments.<\/p>\n<h3>T\u00e9l\u00e9versements de fichiers \u00e0 partir de cha\u00eenes de caract\u00e8res avec CURLStringFile<\/h3>\n<p>L&rsquo;extension PHP Curl prend en charge les requ\u00eates <a href=\"https:\/\/kinsta.com\/fr\/blog\/rediriger-http-vers-https\/\">HTTP(S)<\/a> avec des t\u00e9l\u00e9versements de fichiers. Elle utilise pour cela la classe <strong>CURLFile<\/strong>, qui accepte un URI ou un chemin d&rsquo;acc\u00e8s \u00e0 un fichier, un type mime et le nom final du fichier.<\/p>\n<p>Cependant, avec la classe <strong>CURLFile<\/strong>, vous ne pouvez accepter que le chemin d&rsquo;acc\u00e8s au fichier ou l&rsquo;URI, mais pas le contenu du fichier lui-m\u00eame. Dans les cas o\u00f9 vous aviez d\u00e9j\u00e0 le fichier \u00e0 t\u00e9l\u00e9verser en m\u00e9moire (par exemple, des images trait\u00e9es, des documents XML, des PDF), vous deviez utiliser des URI <code>data:\/\/<\/code> avec un encodage Base64.<\/p>\n<p>Mais <strong>libcurl<\/strong> prend d\u00e9j\u00e0 en charge un moyen plus simple d&rsquo;accepter le contenu du fichier. La nouvelle classe <strong>CURLStringFile<\/strong> ajoute un support pour cela pr\u00e9cis\u00e9ment.<\/p>\n<p>Vous pouvez <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6456\" target=\"_blank\" rel=\"noopener noreferrer\">lire sa page GitHub<\/a> pour en savoir plus sur la fa\u00e7on dont elle est impl\u00e9ment\u00e9e dans PHP 8.1.<\/p>\n<h3>Nouvelle constante <code>MYSQLI_REFRESH_REPLICA<\/code><\/h3>\n<p>L&rsquo;extension <strong>mysqli<\/strong> de PHP 8.1 ajoute une nouvelle constante appel\u00e9e <code>MYSQLI_REFRESH_REPLICA<\/code>. Elle est \u00e9quivalente \u00e0 la constante existante <code>MYSQLI_REFRESH_SLAVE<\/code>.<\/p>\n<p>Ce changement \u00e9tait le bienvenu dans <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6632\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL 8.0.23<\/a> pour rem\u00e9dier \u00e0 l&rsquo;insensibilit\u00e9 raciale dans le vocabulaire technique (les exemples les plus courants incluent \u00ab esclave \u00bb et \u00ab ma\u00eetre \u00bb).<\/p>\n<p>Vous devez noter que l&rsquo;ancienne constante n&rsquo;est pas supprim\u00e9e ou d\u00e9pr\u00e9ci\u00e9e. Les d\u00e9veloppeurs et les applications peuvent continuer \u00e0 l&rsquo;utiliser. Cette nouvelle constante n&rsquo;est qu&rsquo;une option pour les d\u00e9veloppeurs et les entreprises qui souhaitent laisser de c\u00f4t\u00e9 cette terminologie.<\/p>\n<h3>Am\u00e9lioration des performances avec Inheritance Cache<\/h3>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/commit\/4b79dba93202ed5640dff317046ce2fdd42e1d82\" target=\"_blank\" rel=\"noopener noreferrer\">Inheritance Cache<\/a> est un nouvel ajout \u00e0 opcache qui \u00e9limine la surcharge de l&rsquo;h\u00e9ritage des classes PHP.<\/p>\n<p>Les classes PHP sont compil\u00e9es et <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-le-cache\/\">mises en cache<\/a> par opcache s\u00e9par\u00e9ment. Cependant, elles sont d\u00e9j\u00e0 li\u00e9es au moment de l&rsquo;ex\u00e9cution sur chaque requ\u00eate. Ce processus peut impliquer plusieurs contr\u00f4les de compatibilit\u00e9 et l&#8217;emprunt de m\u00e9thodes\/propri\u00e9t\u00e9s\/constantes des classes et traits parents.<\/p>\n<p>Par cons\u00e9quent, l&rsquo;ex\u00e9cution de ce processus prend un temps consid\u00e9rable, m\u00eame si le r\u00e9sultat est le m\u00eame pour chaque requ\u00eate.<\/p>\n<p>Inheritance Cache relie toutes les classes d\u00e9pendantes uniques (parents, interfaces, traits, types de propri\u00e9t\u00e9s, m\u00e9thodes) et stocke les r\u00e9sultats dans la m\u00e9moire partag\u00e9e d&rsquo;opcache. Comme cela ne se produit qu&rsquo;une fois, l&rsquo;h\u00e9ritage n\u00e9cessite moins d&rsquo;instructions.<\/p>\n<p>De plus, il supprime les limitations des classes immuables, comme les constantes non r\u00e9solues, les propri\u00e9t\u00e9s typ\u00e9es et les contr\u00f4les de type covariants. Ainsi, toutes les classes stock\u00e9es dans opcache sont immuables, ce qui r\u00e9duit encore le nombre d&rsquo;instructions n\u00e9cessaires.<\/p>\n<p>Au final, cela promet des avantages significatifs en termes de performances. <a href=\"https:\/\/github.com\/dstogov\" target=\"_blank\" rel=\"noopener noreferrer\">Dimitry Stogov<\/a>, l&rsquo;auteur de ce patch, a constat\u00e9 qu&rsquo;il pr\u00e9sentait une am\u00e9lioration de 8 % sur le programme de base de Symfony \u00ab Hello, World ! \u00bb. Nous sommes impatients de le tester dans nos prochains <a href=\"https:\/\/kinsta.com\/fr\/blog\/comparaison-php\/\">benchmarks PHP<\/a>.<\/p>\n<h3>Syntaxe d&rsquo;appel de premi\u00e8re classe<\/h3>\n<p>PHP 8.1 ajoute une syntaxe d&rsquo;appel de premi\u00e8re classe pour remplacer les codages existants utilisant des cha\u00eenes et des tableaux. En plus de cr\u00e9er un <strong>Closure<\/strong> plus propre, cette nouvelle syntaxe est \u00e9galement accessible par les <a href=\"https:\/\/kinsta.com\/fr\/blog\/outils-revue-code\/\">outils d&rsquo;analyse<\/a> statique et respecte la port\u00e9e d\u00e9clar\u00e9e.<\/p>\n<p>Voici quelques exemples tir\u00e9s de la <a href=\"https:\/\/wiki.php.net\/rfc\/first_class_callable_syntax\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$fn = Closure::fromCallable('strlen');\n$fn = strlen(...);\n \n$fn = Closure::fromCallable([$this, 'method']);\n$fn = $this-&gt;method(...)\n \n$fn = Closure::fromCallable([Foo::class, 'method']);\n$fn = Foo::method(...);<\/code><\/pre>\n<p>Ici, toutes les paires d&rsquo;expressions sont \u00e9quivalentes. La syntaxe \u00e0 triple point (<strong>..<\/strong>. ) est similaire \u00e0 la syntaxe de d\u00e9ballage des arguments (<code>...$args<\/code>). Sauf qu&rsquo;ici, les arguments ne sont pas encore remplis.<\/p>\n<h2>Changements dans PHP 8.1<\/h2>\n<p>PHP 8.1 comprend \u00e9galement des modifications de sa syntaxe et de ses fonctionnalit\u00e9s existantes. Discutons-en :<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"7\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Le shell interactif de PHP n\u00e9cessite l&rsquo;extension <strong>readline<\/strong><\/h3>\n<p>L&rsquo;extension <strong>readline<\/strong> de PHP permet d&rsquo;utiliser les fonctions du <a href=\"https:\/\/kinsta.com\/fr\/blog\/comment-utiliser-ssh\/\">shell interactif<\/a> telles que la navigation, l&rsquo;autocompl\u00e9tion, l&rsquo;\u00e9dition, etc. Bien qu&rsquo;elle soit fournie avec PHP, elle n&rsquo;est pas activ\u00e9e par d\u00e9faut.<\/p>\n<p>Vous pouvez acc\u00e9der au shell interactif de PHP en utilisant l&rsquo;option de ligne de commande <code>-a<\/code> de PHP CLI :<\/p>\n<pre><code class=\"language-php\">php -a\n\nInteractive shell\n\nphp &gt;\nphp &gt; echo \"Hello\";\nHello\nphp &gt; function test() {\nphp { echo \"Hello\";\nphp { }\nphp &gt; test();\nHello<\/code><\/pre>\n<p>Avant PHP 8.1, vous pouviez ouvrir le shell interactif \u00e0 l&rsquo;aide de PHP CLI m\u00eame si l&rsquo;extension <strong>readline<\/strong> n&rsquo;\u00e9tait pas activ\u00e9e. Comme pr\u00e9vu, les fonctions interactives du shell ne fonctionnaient pas, ce qui rendait l&rsquo;option <code>-a<\/code> inutile.<\/p>\n<p>Dans PHP 8.1 CLI, le shell interactif se termine par un message d&rsquo;erreur si vous <a href=\"https:\/\/github.com\/php\/php-src\/commit\/959e5787bdf7c088a57dce5f4f7570abd7fe35f8\" target=\"_blank\" rel=\"noopener noreferrer\">n&rsquo;avez pas activ\u00e9 l&rsquo;extension readline<\/a>.<\/p>\n<pre><code class=\"language-php\">php -a\nInteractive shell (-a) requires the readline extension.<\/code><\/pre>\n<h3>Le mode d&rsquo;erreur par d\u00e9faut de MySQLi est d\u00e9fini sur Exceptions<\/h3>\n<p>Avant PHP 8.1, <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-mysql\/\">MySQLi<\/a> affichait par d\u00e9faut les erreurs en mode silencieux. Ce comportement conduisait souvent \u00e0 un code qui ne suivait pas une gestion stricte des erreurs\/exceptions. Les d\u00e9veloppeurs devaient impl\u00e9menter leurs propres fonctions explicites de gestion des erreurs.<\/p>\n<p>PHP 8.1 change ce comportement en d\u00e9finissant le mode de signalement des erreurs par d\u00e9faut de MySQLi pour lancer une exception.<\/p>\n<pre><code class=\"language-php\">Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...<\/code><\/pre>\n<p>Comme il s&rsquo;agit d&rsquo;un changement de rupture, pour les versions PHP &lt;8.1, vous devez d\u00e9finir explicitement le mode de traitement des erreurs \u00e0 l&rsquo;aide de la fonction <code>mysqli_report<\/code> avant d&rsquo;\u00e9tablir la premi\u00e8re connexion MySQLi. Vous pouvez aussi faire de m\u00eame en s\u00e9lectionnant la valeur de signalement des erreurs en instanciant une instance de <code>mysqli_driver<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_default_errmode\" target=\"_blank\" rel=\"noopener noreferrer\">La RFC<\/a> suit un <a href=\"https:\/\/wiki.php.net\/rfc\/pdo_default_errmode\" target=\"_blank\" rel=\"noopener noreferrer\">changement similaire introduit dans PHP 8.0<\/a>.<\/p>\n<h3>Fin de ligne personnalisable pour les fonctions d&rsquo;\u00e9criture CSV<\/h3>\n<p>Avant PHP 8.1, les fonctions d&rsquo;\u00e9criture <a href=\"https:\/\/kinsta.com\/changelog\/export-redirects-csv\/\">CSV<\/a> int\u00e9gr\u00e9es de PHP, <code>fputcsv<\/code> et <code>SplFileObject::fputcsv<\/code>, \u00e9taient cod\u00e9es en dur pour ajouter un <code>\\n<\/code> (ou le caract\u00e8re Line-Feed) \u00e0 la fin de chaque ligne.<\/p>\n<p>PHP 8.1 ajoute la prise en charge d&rsquo;un nouveau param\u00e8tre nomm\u00e9 <code>eol<\/code> \u00e0 ces fonctions. Vous pouvez l&rsquo;utiliser pour passer un caract\u00e8re de fin de ligne configurable. Par d\u00e9faut, il utilise toujours le caract\u00e8re <code>\\n<\/code>. Vous pouvez donc continuer \u00e0 l&rsquo;utiliser dans votre code existant.<\/p>\n<p>Les r\u00e8gles standard d&rsquo;\u00e9chappement des caract\u00e8res s&rsquo;appliquent \u00e0 l&rsquo;utilisation des caract\u00e8res de fin de ligne. Si vous voulez utiliser <code>\\r<\/code>, <code>\\n<\/code>, ou <code>\\r\\n<\/code> comme caract\u00e8res de fin de ligne, vous devez les mettre entre guillemets.<\/p>\n<p>Voici la <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6403\" target=\"_blank\" rel=\"noopener noreferrer\">page GitHub<\/a> qui suit cette nouvelle modification.<\/p>\n<h3>Nouvelles restrictions de l&rsquo;op\u00e9rateur <code>version_compare<\/code><\/h3>\n<p>La fonction <code>version_compare()<\/code> de PHP compare deux cha\u00eenes de num\u00e9ros de version. Cette fonction accepte un troisi\u00e8me argument facultatif appel\u00e9 <code>operator<\/code> pour tester une relation particuli\u00e8re.<\/p>\n<p>Bien que cela ne soit pas explicitement mentionn\u00e9 dans la documentation, avant PHP 8.1, vous pouviez d\u00e9finir ce param\u00e8tre sur une valeur partielle (par exemple <code>g<\/code>, <code>l<\/code>, <code>n<\/code>) sans risquer une erreur.<\/p>\n<p>PHP 8.1 ajoute des restrictions plus strictes \u00e0 l&rsquo;argument <code>operator<\/code> de la fonction <code>version_compare()<\/code> pour pallier cette situation. Les seuls op\u00e9rateurs que vous pouvez d\u00e9sormais utiliser sont :<\/p>\n<ul>\n<li><strong>==<\/strong>, <strong>=<\/strong>, et <strong>eq<\/strong><\/li>\n<li><strong>!=<\/strong>, <strong>&lt;&gt;<\/strong>, et <strong>ne<\/strong><\/li>\n<li><strong>&gt;<\/strong> et <strong>gt<\/strong><\/li>\n<li><strong>&gt;=<\/strong> et <strong>ge<\/strong><\/li>\n<li><strong>&lt;<\/strong> et <strong>lt<\/strong><\/li>\n<li><strong>&lt;=<\/strong> et <strong>le<\/strong><\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/6510\" target=\"_blank\" rel=\"noopener noreferrer\">Plus de valeurs partielles d&rsquo;op\u00e9rateur<\/a>.<\/p>\n<h3>Les fonctions d&rsquo;encodage et de d\u00e9codage HTML utilisent d\u00e9sormais <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code><\/h3>\n<p>Les entit\u00e9s HTML sont des repr\u00e9sentations textuelles de caract\u00e8res qui seraient autrement interpr\u00e9t\u00e9s comme du HTML. Pensez aux caract\u00e8res tels que <code>&lt;<\/code> et <code>&gt;<\/code> utilis\u00e9s pour <a href=\"https:\/\/kinsta.com\/fr\/blog\/meilleures-pratiques-html\/\">d\u00e9finir les balises HTML<\/a> (par exemple <code>&lt;a&gt;<\/code>, <code>&lt;h3&gt;<\/code>, <code>&lt;script&gt;<\/code>).<\/p>\n<p>L&rsquo;entit\u00e9 HTML pour <code>&lt;<\/code> est <code>& lt;<\/code> (moins que le symbole) et <code>&gt;<\/code> est <code>& gt;<\/code> (plus que le symbole).<\/p>\n<p><strong>Note :<\/strong> Enlevez l&rsquo;espace entre \u00ab &#038; \u00bb et \u00ab amp \u00bb.<\/p>\n<p>Vous pouvez utiliser ces entit\u00e9s HTML en toute s\u00e9curit\u00e9 dans un document HTML sans d\u00e9clencher le moteur de rendu du navigateur.<\/p>\n<p>Par exemple, <code>& lt;script& gt;<\/code> s&rsquo;affichera comme <code>&lt;script&gt;<\/code> dans le navigateur, plut\u00f4t que d&rsquo;\u00eatre interpr\u00e9t\u00e9 comme une balise HTML.<\/p>\n<p>Avant PHP 8.1, les fonctions <a href=\"https:\/\/www.php.net\/manual\/function.htmlspecialchars.php\" target=\"_blank\" rel=\"noopener noreferrer\">htmlspecialchars()<\/a> et <a href=\"https:\/\/www.php.net\/manual\/en\/function.htmlentities.php\" target=\"_blank\" rel=\"noopener noreferrer\">htmlentities()<\/a> convertissaient les symboles comme <strong>\u00ab\u00a0<\/strong>, <code>&lt;<\/code>, <code>&gt;<\/code>, et <code>&<\/code> en leurs entit\u00e9s HTML respectives. Mais elles ne convertissaient pas le caract\u00e8re guillemet simple (<code><strong>'<\/strong><\/code>) en son entit\u00e9 HTML par d\u00e9faut. De plus, elles renvoyaient une cha\u00eene vide s&rsquo;il y avait un UTF-8 malform\u00e9 dans le texte.<\/p>\n<p>En PHP 8.1., ces fonctions d&rsquo;encodage et de d\u00e9codage HTML (et leurs fonctions connexes) <a href=\"https:\/\/github.com\/php\/php-src\/commit\/50eca61f68815005f3b0f808578cc1ce3b4297f0\" target=\"_blank\" rel=\"noopener noreferrer\">convertiront \u00e9galement<\/a> <a href=\"https:\/\/github.com\/php\/php-src\/commit\/50eca61f68815005f3b0f808578cc1ce3b4297f0\" target=\"_blank\" rel=\"noopener noreferrer\">les caract\u00e8res guillemets simples<\/a> en leur entit\u00e9 HTML par d\u00e9faut.<\/p>\n<p>Et si le texte donn\u00e9 contient des caract\u00e8res non valides, les fonctions les remplaceront par un caract\u00e8re de substitution Unicode (\ufffd) au lieu de renvoyer une cha\u00eene vide. PHP 8.1 accomplit cela en changeant les signatures de ces fonctions en <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code> plut\u00f4t qu&rsquo;en <code>ENT_COMPAT<\/code> par d\u00e9faut.<\/p>\n<p>La plupart des frameworks utilisent d\u00e9j\u00e0 <code>ENT_QUOTES<\/code> comme valeur par d\u00e9faut de l&rsquo;indicateur. Vous ne verrez donc pas beaucoup de diff\u00e9rence suite \u00e0 ce changement. Cependant, le nouveau drapeau <code>ENT_SUBSTITUTE<\/code> n&rsquo;est pas tr\u00e8s utilis\u00e9. PHP 8.1 fera en sorte que les caract\u00e8res UTF-8 invalides soient remplac\u00e9s par le caract\u00e8re \ufffd au lieu de renvoyer une cha\u00eene vide.<\/p>\n<h3>Avertissement sur les appels ill\u00e9gaux \u00e0 la fonction <strong>compact<\/strong><\/h3>\n<p>La fonction <code>compact()<\/code> de PHP est super pratique. Vous pouvez l&rsquo;utiliser pour cr\u00e9er un tableau avec des variables en utilisant leurs noms et leurs valeurs.<\/p>\n<p>Par exemple, consid\u00e8rez le code suivant :<\/p>\n<pre class=\" language-php\"><code class=\" language-php\"><span class=\"token variable\">$animal<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string single-quoted-string\">'Cat'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token variable\">$sound<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string single-quoted-string\">'Meow'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token variable\">$region<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string single-quoted-string\">'Istanbul'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token function\">compact<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string single-quoted-string\">'animal'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string single-quoted-string\">'sound'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string single-quoted-string\">'region'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token comment\">\/\/ ['animal' =&gt; \"Cat\", 'sound' =&gt; \"Meow\", 'region' =&gt; \"Istanbul\"]<\/span><\/code><\/pre>\n<p>La <a href=\"https:\/\/www.php.net\/manual\/en\/function.compact.php\" target=\"_blank\" rel=\"noopener noreferrer\">documentation de la fonction compact<\/a> indique qu&rsquo;elle n&rsquo;accepte que les param\u00e8tres de type cha\u00eene ou les valeurs de tableau avec des valeurs de type cha\u00eene. Cependant, avant PHP 7.3, toutes les cha\u00eenes qui ne sont pas d\u00e9finies sont ignor\u00e9es en silence.<\/p>\n<p>PHP 7.3 a modifi\u00e9 la fonction <code>compact()<\/code> pour afficher un avis si vous utilisez des variables ind\u00e9finies. <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\" target=\"_blank\" rel=\"noopener noreferrer\">PHP 8.1 va encore plus loin<\/a> et affiche un avertissement.<\/p>\n<p>Vous pouvez <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\" target=\"_blank\" rel=\"noopener noreferrer\">lire sa page GitHub<\/a> pour comprendre comment ce changement est apparu.<\/p>\n<h3>Nouvelles migrations des ressources vers les objets de classe<\/h3>\n<p>L&rsquo;un des objectifs \u00e0 long terme de PHP est de passer <a href=\"https:\/\/php.watch\/articles\/resource-object\" target=\"_blank\" rel=\"noopener noreferrer\">des ressources aux objets de classe standard<\/a>.<\/p>\n<p>Pour des raisons historiques, les objets ressources sont largement utilis\u00e9s dans les applications PHP. Par cons\u00e9quent, la migration des ressources vers les objets de classe doit \u00eatre aussi peu perturbante que possible. PHP 8.1 fait migrer cinq de ces ressources :<\/p>\n<h4>La ressource <code>file_info<\/code> migr\u00e9e vers les objets <code>finfo<\/code><\/h4>\n<p>La <a href=\"https:\/\/www.php.net\/manual\/en\/class.finfo.php\" target=\"_blank\" rel=\"noopener noreferrer\">classe finfo<\/a> de PHP offre une interface <a href=\"https:\/\/kinsta.com\/fr\/blog\/programmation-orientee-objet-python\/#what-is-objectoriented-programming-in-python\">orient\u00e9e objet<\/a> pour les fonctions <code>fileinfo<\/code>. Cependant, l&rsquo;utilisation des fonctions <code>finfo<\/code> renvoie des objets <code>ressources<\/code> avec le type <code>file_info<\/code> plut\u00f4t qu&rsquo;une instance de la classe <code>finfo<\/code> elle-m\u00eame.<\/p>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/5987\" target=\"_blank\" rel=\"noopener noreferrer\">PHP 8.1 corrige cette anomalie<\/a>.<\/p>\n<h4>Les ressources IMAP ont migr\u00e9 vers les objets de la classe <code>IMAP\\Connection<\/code><\/h4>\n<p>Conform\u00e9ment \u00e0 l&rsquo;objectif de migration des ressources vers les objets, la nouvelle classe <code>IMAP\\Connection<\/code> minimise les changements de rupture potentiels lorsque PHP modifie \u00e9ventuellement les d\u00e9tails de l&rsquo;impl\u00e9mentation de la classe.<\/p>\n<p>Cette nouvelle classe est \u00e9galement d\u00e9clar\u00e9e <code>finale<\/code>, vous n&rsquo;\u00eates donc pas autoris\u00e9 \u00e0 <code>extend<\/code>.<\/p>\n<p>Lisez-en plus sur sa mise en \u0153uvre sur <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6418\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a>.<\/p>\n<h4>Les ressources de connexion FTP sont maintenant des objets de la classe <code>FTP\\Connection<\/code><\/h4>\n<p>En PHP &lt;8.1, si vous cr\u00e9iez une <a href=\"https:\/\/kinsta.com\/fr\/blog\/meilleurs-clients-ftp\/\">connexion FTP<\/a> avec les fonctions <code>ftp_connect()<\/code> ou <code>ftp_ssl_connect()<\/code>, vous r\u00e9cup\u00e9riez un objet <strong>ressource<\/strong> de type<strong> ftp<\/strong>.<\/p>\n<p>PHP 8.1 ajoute la nouvelle classe <code>FTP\\Connection<\/code> pour rectifier cela. Et comme pour la classe <code>IMAP\\Connection<\/code>, elle est \u00e9galement d\u00e9clar\u00e9e <code>finale<\/code> pour \u00e9viter qu&rsquo;elle ne soit \u00e9tendue.<\/p>\n<p>Lisez-en plus sur <a href=\"https:\/\/github.com\/php\/php-src\/commit\/b4503fbf882e490f16d85915e83173bd1e414e84\" target=\"_blank\" rel=\"noopener noreferrer\">sa mise en \u0153uvre<\/a> sur sa page GitHub.<\/p>\n<h4>Les identificateurs de police ont migr\u00e9 vers les objets de la classe <code>GdFont<\/code><\/h4>\n<p>L&rsquo;extension GD de PHP fournit la <a href=\"https:\/\/www.php.net\/manual\/en\/function.imageloadfont.php\" target=\"_blank\" rel=\"noopener noreferrer\">fonction imageloadfont()<\/a> pour charger un bitmap d\u00e9fini par l&rsquo;utilisateur et renvoyer son identifiant de ressource de police (un nombre entier).<\/p>\n<p>En PHP 8.1, cette fonction renverra plut\u00f4t une instance de la classe <strong>GdFont<\/strong>. De plus, pour faciliter la migration, toutes les fonctions qui acceptaient auparavant un ID de ressource de <code>imageloadfont()<\/code> prendront d\u00e9sormais les nouveaux objets de la classe <strong>GdFont<\/strong>.<\/p>\n<p>Pour en savoir plus sur cette migration, consultez <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bc40bce868e208fa2d7af950845759d3ef498b5d\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a>.<\/p>\n<h4>Les ressources LDAP ont migr\u00e9 vers des objets<\/h4>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/intro.ldap.php\" target=\"_blank\" rel=\"noopener noreferrer\">LDAP<\/a>, ou Lightweight Directory Access Protocol, est utilis\u00e9 pour acc\u00e9der aux \u00ab serveurs de r\u00e9pertoire \u00bb Comme une structure de r\u00e9pertoire de disque dur, c&rsquo;est une base de donn\u00e9es unique qui contient des donn\u00e9es dans une structure arborescente.<\/p>\n<p>PHP inclut une extension LDAP qui acceptait ou renvoyait des objets <strong>resource <\/strong>avant PHP 8.1. Cependant, ils ont tous migr\u00e9 de fa\u00e7on transparente vers de nouvelles instances de classe maintenant. Les types de <strong>ressources<\/strong> qui ont fait l&rsquo;objet d&rsquo;une transition sont :<\/p>\n<ul>\n<li>ressource <code>ldap link<\/code> vers l&rsquo;objet de classe <code>\\LDAP\\Connection<\/code><\/li>\n<li>ressource <code>ldap result<\/code> vers l&rsquo;objet de classe <code>\\LDAP\\Result<\/code><\/li>\n<li>ressource <code>ldap result entry<\/code> vers l&rsquo;objet de classe <code>\\LDAP\\ResultEntry<\/code><\/li>\n<\/ul>\n<p>Consultez <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6770\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a> pour mieux comprendre cette migration.<\/p>\n<h4>Les ressources Pspell sont maintenant des objets de classe<\/h4>\n<p>L&rsquo;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.pspell.php\" target=\"_blank\" rel=\"noopener noreferrer\">extension Pspell<\/a> de PHP vous permet de v\u00e9rifier l&rsquo;orthographe et les suggestions de mots.<\/p>\n<p>PHP &lt;8.1 utilisait les types d&rsquo;objets ressources <code>pspell<\/code> et <code>pspell config<\/code> avec un identifiant entier. Ces deux objets ressources sont d\u00e9sormais remplac\u00e9s par les objets de classe <code>PSpell\\Dictionary<\/code> et <code>PSpell\\Config<\/code>.<\/p>\n<p>Comme pour les migrations pr\u00e9c\u00e9dentes, <a href=\"https:\/\/php.watch\/versions\/8.1\/PSpell-resource#PSpell-Dictionary\" target=\"_blank\" rel=\"noopener noreferrer\">toutes les fonctions Pspell<\/a> qui acceptaient ou renvoyaient auparavant des identifiants d&rsquo;objets ressources prendront les nouvelles instances d&rsquo;objets de classe.<\/p>\n<p>Reportez-vous \u00e0 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bd12c94f46438dad03d1d3c02fff37b9b950ae6f\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a> pour plus d&rsquo;informations.<\/p>\n<h2>D\u00e9pr\u00e9ciations dans PHP 8.1<\/h2>\n<p>PHP 8.1 rend obsol\u00e8te un grand nombre de ses fonctionnalit\u00e9s pr\u00e9c\u00e9dentes. La liste suivante donne un bref aper\u00e7u des fonctionnalit\u00e9s que PHP 8.1 d\u00e9pr\u00e9cie :<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"10\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Impossible de passer <code>null<\/code> \u00e0 des param\u00e8tres de fonction non nuls<\/h3>\n<p>Depuis PHP 8.0, ses fonctions internes acceptent silencieusement les valeurs <code>null<\/code> m\u00eame pour les arguments non nuls. Il n&rsquo;en va pas de m\u00eame pour les fonctions d\u00e9finies par l&rsquo;utilisateur : elles n&rsquo;acceptent <code>null<\/code> que pour les arguments nullables.<\/p>\n<p>Par exemple, consid\u00e8re cette utilisation :<\/p>\n<pre><code class=\"language-php\">var_dump<strong>(str_contains<\/strong>(\"foobar\", null));\n\/\/ bool<strong>(true<\/strong>)<\/code><\/pre>\n<p>Ici, la valeur <code>nul<\/code> est silencieusement convertie en une cha\u00eene vide. Ainsi, le r\u00e9sultat renvoie <code>true<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_null_to_scalar_internal_arg\" target=\"_blank\" rel=\"noopener noreferrer\">Cette RFC<\/a> vise \u00e0 synchroniser le comportement des fonctions internes en lan\u00e7ant un avertissement de d\u00e9pr\u00e9ciation dans PHP 8.1.<\/p>\n<pre><code class=\"language-php\">var_dump(str_contains(\"foobar\", null));\n\/\/ Deprecated: Passing null to argument of type string is deprecated<\/code><\/pre>\n<p>La d\u00e9pr\u00e9ciation deviendra une TypeError dans la prochaine version majeure de PHP (c&rsquo;est-\u00e0-dire PHP &gt;=9.0), rendant le comportement des fonctions internes coh\u00e9rent avec les fonctions d\u00e9finies par l&rsquo;utilisateur.<\/p>\n<h3>Utilisation restreinte de <code>$GLOBALS<\/code><\/h3>\n<p>La variable <code>$GLOBALS<\/code> de PHP fournit une r\u00e9f\u00e9rence directe \u00e0 sa table de symboles interne. La prise en charge de cette fonctionnalit\u00e9 est complexe et affecte les performances des op\u00e9rations de tableau. De plus, elle est rarement utilis\u00e9e.<\/p>\n<p>Conform\u00e9ment \u00e0 <a href=\"https:\/\/wiki.php.net\/rfc\/restrict_globals_usage\">la RFC<\/a>, la modification indirecte de <code>$GLOBALS<\/code> n&rsquo;est plus autoris\u00e9e. Ce changement est incompatible avec le pass\u00e9.<\/p>\n<p>L&rsquo;impact de ce changement est relativement faible :<\/p>\n<blockquote><p><em>Dans les 2000 premiers paquets du composer, j&rsquo;ai trouv\u00e9 <\/em><a href=\"https:\/\/gist.github.com\/nikic\/9fd95866f9811b349b947f63214ad7a9\" target=\"_blank\" rel=\"noopener noreferrer\"><em>23 cas qui utilisent $GLOBALS<\/em><\/a><em> sans le d\u00e9r\u00e9f\u00e9rencer directement. D&rsquo;apr\u00e8s une inspection sommaire, il n&rsquo;y a que deux cas o\u00f9 <\/em><strong><em>$GLOBALS<\/em><\/strong><em> n&rsquo;est pas utilis\u00e9 en lecture seule.<\/em><\/p><\/blockquote>\n<p>Cependant, l&rsquo;utilisation en lecture seule de <code>$GLOBALS<\/code> continue de fonctionner comme d&rsquo;habitude. Ce qui n&rsquo;est plus pris en charge, c&rsquo;est l&rsquo;\u00e9criture dans <code>$GLOBALS<\/code> dans son ensemble. Par cons\u00e9quent, vous pouvez vous attendre \u00e0 une l\u00e9g\u00e8re <a href=\"https:\/\/kinsta.com\/fr\/blog\/outils-test-performances\/\">augmentation des performances<\/a>, surtout lorsque vous travaillez avec des tableaux PHP ordinaires.<\/p>\n<h3>D\u00e9clarations de type de retour pour les fonctions internes<\/h3>\n<p>PHP 8.0 a permis aux d\u00e9veloppeurs de d\u00e9clarer les param\u00e8tres et les types de retour pour la plupart des fonctions et m\u00e9thodes internes. Cela a \u00e9t\u00e9 possible gr\u00e2ce \u00e0 diverses RFC telles que <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#type-errors-internal-functions\">Consistent type errors for internal functions<\/a>, <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#union-types-2-0\">Union Types 2.0<\/a>, et <a href=\"https:\/\/wiki.php.net\/rfc\/mixed_type_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Mixed Type v2<\/a>.<\/p>\n<p>Cependant, il existe de nombreux cas o\u00f9 les informations de type peuvent manquer. Certains d&rsquo;entre eux incluent un type avec des ressources, des param\u00e8tres <strong>out<\/strong> pass-by-ref, le type de retour des m\u00e9thodes non finales, et les fonctions ou m\u00e9thodes qui n&rsquo;analysent pas les param\u00e8tres selon les r\u00e8gles g\u00e9n\u00e9rales. Vous pouvez lire les d\u00e9tails exacts dans <a href=\"https:\/\/wiki.php.net\/rfc\/internal_method_return_types\" target=\"_blank\" rel=\"noopener noreferrer\">sa RFC<\/a>.<\/p>\n<p>Cette RFC ne traite que le probl\u00e8me du type de retour des m\u00e9thodes non finales. Cependant, plut\u00f4t que de l&rsquo;\u00e9liminer compl\u00e8tement et imm\u00e9diatement, l&rsquo;\u00e9quipe PHP propose une voie de migration progressive pour mettre \u00e0 jour vos bases de code avec les types de retour des m\u00e9thodes concern\u00e9es.<\/p>\n<p><em>Les types de retour des m\u00e9thodes internes non finales &#8211; lorsque cela est possible &#8211; sont d\u00e9clar\u00e9s provisoirement dans PHP 8.1, et ils seront appliqu\u00e9s dans PHP 9.0. Cela signifie que dans les versions PHP 8.x, un avis \u00ab d\u00e9pr\u00e9ci\u00e9\u00bb est affich\u00e9 pendant les v\u00e9rifications d&rsquo;h\u00e9ritage lorsqu&rsquo;une m\u00e9thode interne est surcharg\u00e9e d&rsquo;une mani\u00e8re qui rend les types de retour incompatibles, et PHP 9.0 en fera une erreur fatale.<\/em><\/p>\n<p>Si vous voyez cette notification de d\u00e9pr\u00e9ciation apr\u00e8s avoir mis \u00e0 jour PHP 8.1, assurez-vous de mettre \u00e0 jour les types de retour de vos m\u00e9thodes.<\/p>\n<h3>Interface s\u00e9rialisable d\u00e9pr\u00e9ci\u00e9e<\/h3>\n<p>PHP 7.4 a introduit le <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#serialization\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9canisme de s\u00e9rialisation des objets personnalis\u00e9s<\/a> avec deux nouvelles m\u00e9thodes magiques : <code>__serialize()<\/code> et <code>__unserialize()<\/code>. Ces nouvelles m\u00e9thodes ont pour but de remplacer \u00e0 terme l&rsquo;interface <strong>Serializable<\/strong> qui n&rsquo;existe plus.<\/p>\n<p>Cette <a href=\"https:\/\/wiki.php.net\/rfc\/phase_out_serializable\" target=\"_blank\" rel=\"noopener noreferrer\">RFC propose<\/a> de finaliser cette d\u00e9cision en \u00e9tablissant un plan pour la suppression \u00e9ventuelle de <strong>Serializable<\/strong>.<\/p>\n<p>Dans PHP 8.1, si vous impl\u00e9mentez l&rsquo;interface <strong>Serializable<\/strong> sans impl\u00e9menter les m\u00e9thodes <code>__serialize()<\/code> et <code>__unserialize()<\/code>, PHP lancera un avertissement \u00ab Deprecated \u00bb.<\/p>\n<pre><code class=\"language-php\">Deprecated: The Serializable interface is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line ...<\/code><\/pre>\n<p>Si vous supportez <strong>PHP &lt;7.4<\/strong> et <strong>PHP &gt;=7.4<\/strong>, vous devez impl\u00e9menter \u00e0 la fois l&rsquo;interface <strong>Serializable<\/strong> et les nouvelles m\u00e9thodes magiques. Sur les versions <strong>PHP &gt;=7.4<\/strong>, les m\u00e9thodes magiques seront prioritaires.<\/p>\n<h3>Conversions non compatibles de <code>float<\/code> \u00e0 <code>int<\/code>\u00a0d\u00e9pr\u00e9ci\u00e9es<\/h3>\n<p>PHP est un langage dynamiquement typ\u00e9. En tant que tel, il existe de nombreux cas o\u00f9 la coercition de type se produit naturellement. La plupart de ces coercitions sont inoffensives et super pratiques.<\/p>\n<p>Cependant, lorsqu&rsquo;un nombre <strong>flot<\/strong> est converti en <strong>integer<\/strong>, cela entra\u00eene souvent une perte de donn\u00e9es. Par exemple, lorsque le nombre flottant <strong>3,14<\/strong> est converti en un nombre entier<strong> 3<\/strong>, il perd sa valeur fractionnaire.<\/p>\n<p>La m\u00eame chose se produit lorsque le float est en dehors de la plage d&rsquo;entiers de la plateforme, ou lorsqu&rsquo;une cha\u00eene de floats est convertie en entier.<\/p>\n<p>PHP 8.1 rectifie ce comportement et aligne sa contrainte de type dynamique sur la plupart des langages de programmation modernes. L&rsquo;objectif est de rendre ces coercitions pr\u00e9visibles et intuitives.<\/p>\n<p>Dans PHP 8.1, vous verrez un avis de d\u00e9pr\u00e9ciation lorsqu&rsquo;un <strong>float<\/strong> non compatible est implicitement converti en<strong> int<\/strong>. Mais qu&rsquo;est-ce qui constitue un float compatible avec les entiers ? <a href=\"https:\/\/wiki.php.net\/rfc\/implicit-float-int-deprecate\" target=\"_blank\" rel=\"noopener noreferrer\">La RFC<\/a> r\u00e9pond \u00e0 cette question :<\/p>\n<p><em>Un float est dit compatible avec les entiers s&rsquo;il poss\u00e8de les caract\u00e9ristiques suivantes :<\/em><\/p>\n<ul>\n<li><em>Est un nombre (c&rsquo;est-\u00e0-dire pas NaN ou Infinity)<\/em><\/li>\n<li><em>Est dans la plage d&rsquo;un entier PHP (selon la plateforme)<\/em><\/li>\n<li><em>N&rsquo;a pas de partie fractionnaire<\/em><\/li>\n<\/ul>\n<p>Cet avis de d\u00e9pr\u00e9ciation sera transform\u00e9 en <strong>TypeError<\/strong> dans la prochaine version majeure de PHP (c&rsquo;est-\u00e0-dire PHP 9.0).<\/p>\n<h3>Les m\u00e9thodes <code>mysqli::get_client_info<\/code> et <code>mysqli_get_client_info($param)<\/code>\u00a0sont d\u00e9pr\u00e9ci\u00e9es<\/h3>\n<p>L&rsquo;API client MySQL d\u00e9finit deux constantes : <code>client_info<\/code> (une cha\u00eene) et <code>client_version<\/code> (un int). MySQL Native Driver (MySQLnd) fait partie de la source officielle de PHP et associe ces constantes \u00e0 la version de PHP. Dans libmysql, elles repr\u00e9sentent la version de la biblioth\u00e8que client au moment de la compilation.<\/p>\n<p>Avant PHP 8.1, mysqli exposait ces constantes de 4 fa\u00e7ons : propri\u00e9t\u00e9s <code>mysqli_driver<\/code>, <code><strong> propri\u00e9t\u00e9s<\/strong><\/code> mysqli, fonction <code>mysqli_get_client_info()<\/code> et m\u00e9thode <code>mysqli::get_client_info<\/code>. Cependant, il n&rsquo;y a pas de m\u00e9thode pour <code>client_version<\/code>.<\/p>\n<p>MySQLnd expose ces constantes de 2 fa\u00e7ons \u00e0 PHP : une constante et un appel de fonction. Pour unifier les m\u00e9thodes d&rsquo;acc\u00e8s mysqli avec ces deux m\u00eames options, PHP 8.1 d\u00e9pr\u00e9cie ces deux autres options :<\/p>\n<ul>\n<li>la m\u00e9thode <code>get_client_info<\/code> de la classe <strong>mysqli<\/strong>. \u00c0 la place, vous pouvez simplement utiliser la fonction <code>mysqli_get_client_info()<\/code>.<\/li>\n<li>fonction <code>mysqli_get_client_info()<\/code> avec param\u00e8tres. Appelle la fonction sans aucun param\u00e8tre pour \u00e9viter l&rsquo;avis de d\u00e9pr\u00e9ciation.<\/li>\n<\/ul>\n<p>Lisez-en plus sur cette d\u00e9pr\u00e9ciation sur <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6777\" target=\"_blank\" rel=\"noopener noreferrer\">sa page GitHub<\/a>.<\/p>\n<h3>Toutes les fonctions <code>mhash*()<\/code>\u00a0(extension hash) sont d\u00e9pcr\u00e9ci\u00e9es<\/h3>\n<p>PHP 5.3 a int\u00e9gr\u00e9 les fonctions <code>mhash*()<\/code> dans <code>ext\/hash<\/code> comme couche de compatibilit\u00e9 pour <code>ext\/mhash<\/code>. Plus tard, PHP 7.0 a supprim\u00e9 <code>ext\/mhash<\/code>.<\/p>\n<p>Contrairement aux fonctions <code>hash_*()<\/code>, les fonctions <code>mhash*()<\/code> ne sont pas toujours disponibles. Vousdevez les activer s\u00e9par\u00e9ment lors de la configuration de PHP.<\/p>\n<p>Dans PHP 7.4, l&rsquo;extension hash a \u00e9t\u00e9 fournie avec PHP, ce qui en fait une extension par d\u00e9faut pour PHP. Cependant, l&rsquo;activation de l&rsquo;option <code>--enable-mhash<\/code> est toujours possible pour des raisons de compatibilit\u00e9.<\/p>\n<p>L&rsquo;\u00e9quipe PHP a d\u00e9cid\u00e9 de <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#mhash_function_family\" target=\"_blank\" rel=\"noopener noreferrer\">d\u00e9pr\u00e9cier les fonctions mhash*()<\/a> dans PHP 8.1, et de les supprimer compl\u00e8tement dans PHP 9.0. Les fonctions d\u00e9pr\u00e9ci\u00e9es sont <code>mhash()<\/code>, <code>mhash_keygen_s2k()<\/code>, <code>mhash_count()<\/code>, <code>mhash_get_block_size()<\/code> et <code>mhash_get_hash_name()<\/code>. Vous pouvez utiliser les fonctionnalit\u00e9s standard de <code>ext\/hash<\/code> \u00e0 leur place.<\/p>\n<h3>Les param\u00e8tres INI <code>filter.default<\/code> et <code>filter.default_options<\/code>\u00a0sont d\u00e9pr\u00e9ci\u00e9s<\/h3>\n<p>Les param\u00e8tres INI <code>filter.default<\/code> de PHP vous permettent d&rsquo;appliquer un filtre \u00e0 tous les super-globaux de PHP, c&rsquo;est-\u00e0-dire aux donn\u00e9es GPCRS (<code>$_GET<\/code>, <code>$_POST<\/code>, <code>$_COOKIE<\/code>, <code>$_REQUEST<\/code> et <code>$_SERVER<\/code>).<\/p>\n<p>Par exemple, vous pouvez d\u00e9finir <code>filter.default=magic_quotes<\/code> ou <code>filter.default=add_slashes<\/code> (en fonction de la version de PHP) pour ressusciter la fonction <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magic_quotes\" target=\"_blank\" rel=\"noopener noreferrer\">controvers\u00e9e et peu s\u00fbre des guillemets magiques<\/a> de PHP (supprim\u00e9e dans PHP 5.4).<\/p>\n<p>Le param\u00e8tre INI <code>filter.default<\/code> fournit une fonctionnalit\u00e9 suppl\u00e9mentaire en autorisant beaucoup plus de filtres, ce qui rend la situation encore pire. Par exemple, son autre option &#8211; <code>filter.default=special_chars<\/code> &#8211; active les guillemets magiques uniquement pour le HTML. Ces param\u00e8tres sont beaucoup moins connus.<\/p>\n<p>PHP 8.1 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#filterdefault_ini_setting\" target=\"_blank\" rel=\"noopener noreferrer\">lancera un avertissement de d\u00e9pr\u00e9ciation<\/a> si <code>filter.default<\/code> est d\u00e9fini sur une valeur autre que <code>unsafe_raw<\/code> (la valeur par d\u00e9faut). Vous ne verrez pas d&rsquo;avis de d\u00e9pr\u00e9ciation distinct pour <code>filter.default_options<\/code>, mais PHP 9.0 supprimera ces deux param\u00e8tres INI.<\/p>\n<p>Comme alternative, vous pouvez commencer \u00e0 utiliser la fonction <a href=\"https:\/\/www.php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener noreferrer\">filter_var()<\/a>. Elle filtre les variables avec le filtre sp\u00e9cifi\u00e9.<\/p>\n<h3>D\u00e9pr\u00e9cier l&rsquo;<code>autovivification<\/code> sur <strong>false<\/strong><\/h3>\n<p>PHP permet l&rsquo;autovivification (cr\u00e9ation automatique de tableaux \u00e0 partir de valeurs fausses). Cette fonction est super utile si la variable est ind\u00e9finie.<\/p>\n<p>N\u00e9anmoins, il n&rsquo;est pas id\u00e9al de cr\u00e9er automatiquement un tableau lorsque la valeur est fausse ou nulle.<\/p>\n<p>Ce <a href=\"https:\/\/wiki.php.net\/rfc\/autovivification_false\" target=\"_blank\" rel=\"noopener noreferrer\">RFC interdit l&rsquo;autovivification<\/a> \u00e0 partir de valeurs fausses. Cependant, notez que l&rsquo;autovivification \u00e0 partir de variables ind\u00e9finies et de null est toujours autoris\u00e9e.<\/p>\n<p>En PHP 8.1, l&rsquo;ajout \u00e0 une variable de type false \u00e9mettra un avis de d\u00e9pr\u00e9ciation :<\/p>\n<pre><code class=\"language-php\">Deprecated: Automatic conversion of false to array is deprecated in<\/code><\/pre>\n<p>PHP 9.0 lancera une erreur fatale pour la m\u00eame chose, ce qui est identique aux autres types scalaires.<\/p>\n<h3>La propri\u00e9t\u00e9 <code>mysqli_driver-&gt;driver_version<\/code>\u00a0est d\u00e9pr\u00e9ci\u00e9e<\/h3>\n<p>La propri\u00e9t\u00e9 <strong>mysqli_driver-&gt;driver_version<\/strong> de l&rsquo;extension MySQLi n&rsquo;a pas \u00e9t\u00e9 mise \u00e0 jour depuis 13 ans. Malgr\u00e9 les nombreuses modifications apport\u00e9es au pilote depuis lors, il renvoie toujours l&rsquo;ancienne valeur de la version du pilote, ce qui rend cette propri\u00e9t\u00e9 inutile.<\/p>\n<p>Dans PHP 8.1, la <a href=\"https:\/\/github.com\/php\/php-src\/commit\/3dfd3558ca2f63f\" target=\"_blank\" rel=\"noopener noreferrer\">propri\u00e9t\u00e9 mysqli_driver-&gt;driver_version est d\u00e9pr\u00e9ci\u00e9e<\/a>.<\/p>\n<h2>Autres changements mineurs<\/h2>\n<p>Il y a <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1\">beaucoup plus de d\u00e9pr\u00e9ciations dans PHP 8.1<\/a>. Les lister toutes ici serait un exercice \u00e9puisant. Nous vous recommandons de consulter directement le RFC pour ces d\u00e9pr\u00e9ciations mineures.4<\/p>\n<p>La page GitHub de PHP comprend \u00e9galement un guide des <a href=\"https:\/\/github.com\/php\/php-src\/blob\/master\/UPGRADING\" target=\"_blank\" rel=\"noopener noreferrer\">NOTES DE MISE \u00c0 JOUR de PHP 8.1<\/a>. Il r\u00e9pertorie tous les changements de rupture que vous dois prendre en compte avant de passer \u00e0 PHP 8.1.<\/p>\n\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>PHP 8.1 est meilleur que <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\">son pr\u00e9d\u00e9cesseur,<\/a> ce qui n&rsquo;est pas une mince affaire. Nous pensons que les fonctionnalit\u00e9s les plus int\u00e9ressantes de PHP 8.1 sont les Enums, les Fibers, les Pure Intersection Types, et ses nombreuses am\u00e9liorations de performances. De plus, nous sommes impatients de mettre PHP 8.1 \u00e0 l&rsquo;\u00e9preuve et de comparer diff\u00e9rents <a href=\"https:\/\/kinsta.com\/fr\/blog\/frameworks-php\/\">frameworks<\/a> et <a href=\"https:\/\/kinsta.com\/fr\/part-de-marche-de-wordpress\/\">CMS<\/a> PHP.<\/p>\n<p>N&rsquo;oubliez pas d&rsquo;ajouter cet article de blog dans vos favoris pour vous y r\u00e9f\u00e9rer ult\u00e9rieurement.<\/p>\n<p><em>Quelle fonctionnalit\u00e9 de PHP 8.1 est votre pr\u00e9f\u00e9r\u00e9e ? Partagez vos pens\u00e9es avec la communaut\u00e9 dans la section des commentaires ci-dessous.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sorti le 25 novembre 2021, PHP 8.1 est enfin l\u00e0, avec plusieurs fonctionnalit\u00e9s int\u00e9ressantes. Dans cet article, nous allons couvrir en d\u00e9tail les nouveaut\u00e9s de PHP &#8230;<\/p>\n","protected":false},"author":117,"featured_media":48157,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[31,536],"topic":[1000],"class_list":["post-48113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-php-8-1","topic-mises-a-jour-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-31T11:31:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T11:34:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/11\/FR-Homepage-featured-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"false\" \/>\n<meta name=\"twitter:description\" content=\"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !\" \/>\n<meta name=\"twitter:image\" content=\"http:\/\/[]\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"39 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore\",\"datePublished\":\"2021-08-31T11:31:50+00:00\",\"dateModified\":\"2023-08-22T11:34:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\"},\"wordCount\":8944,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png\",\"keywords\":[\"php\",\"php 8.1\"],\"articleSection\":[\"D\u00e9veloppement web\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\",\"name\":\"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png\",\"datePublished\":\"2021-08-31T11:31:50+00:00\",\"dateModified\":\"2023-08-22T11:34:42+00:00\",\"description\":\"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png\",\"width\":1460,\"height\":730,\"caption\":\"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mises \u00e0 jour PHP\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/mises-a-jour-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/fr\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore","description":"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/","og_locale":"fr_FR","og_type":"article","og_title":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore","og_description":"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !","og_url":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2021-08-31T11:31:50+00:00","article_modified_time":"2023-08-22T11:34:42+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/11\/FR-Homepage-featured-image.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_title":"false","twitter_description":"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !","twitter_image":"[\"\"]","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Salman Ravoof","Dur\u00e9e de lecture estim\u00e9e":"39 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore","datePublished":"2021-08-31T11:31:50+00:00","dateModified":"2023-08-22T11:34:42+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/"},"wordCount":8944,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png","keywords":["php","php 8.1"],"articleSection":["D\u00e9veloppement web"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/","url":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/","name":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png","datePublished":"2021-08-31T11:31:50+00:00","dateModified":"2023-08-22T11:34:42+00:00","description":"D\u00e9couvrez les nouveaut\u00e9s de PHP 8.1. Des nouvelles fonctionnalit\u00e9s et am\u00e9liorations des performances de PHP 8.1 aux changements et d\u00e9pr\u00e9ciations, nous les couvrons toutes !","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/php-8-1\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/08\/php-8.1.png","width":1460,"height":730,"caption":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Mises \u00e0 jour PHP","item":"https:\/\/kinsta.com\/fr\/sujets\/mises-a-jour-php\/"},{"@type":"ListItem","position":3,"name":"Quoi de neuf dans PHP 8.1 : Fonctionnalit\u00e9s, changements, am\u00e9liorations et plus encore"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/fr\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/48113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=48113"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/48113\/revisions"}],"predecessor-version":[{"id":51109,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/48113\/revisions\/51109"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/it"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/es"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/translations\/nl"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/48113\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/48157"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=48113"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=48113"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=48113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}