{"id":9789,"date":"2022-03-10T09:17:24","date_gmt":"2022-03-10T09:17:24","guid":{"rendered":"\/tutoriels\/?p=9789"},"modified":"2024-09-26T00:58:13","modified_gmt":"2024-09-26T00:58:13","slug":"php-8-1","status":"publish","type":"post","link":"\/fr\/tutoriels\/php-8-1","title":{"rendered":"PHP 8.1 : nouvelles fonctions et d\u00e9pr\u00e9ciations (derni\u00e8re version)"},"content":{"rendered":"<p>La version PHP 8.1 est la nouvelle version de PHP publi&eacute;e en novembre 2021. Cette version s&rsquo;accompagne de nouvelles fonctionnalit&eacute;s, d&rsquo;am&eacute;liorations des performances et de changements qui ouvriront davantage de possibilit&eacute;s aux <a href=\"\/fr\/tutoriels\/redirection-php\/\">d&eacute;veloppeurs PHP<\/a> pour travailler de mani&egrave;re efficace et plus cr&eacute;ative.<\/p><p>Il existe plus de 20 nouvelles fonctionnalit&eacute;s, des tonnes de changements, et plusieurs d&eacute;pr&eacute;ciations dans PHP 8.1. Cet article va les passer en revue et vous aider &agrave; passer en douceur de PHP 8.0 &agrave; PHP 8.1.<\/p><figure class=\"wp-block-image size-full\"><a href=\"https:\/\/assets.hostinger.com\/content\/tutorials\/pdf\/Speed-Up-Your-Website-FR.pdf\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/eBook_-Speed-Up-your-website-FR-1024x283-1.png\/public\" alt=\"\" class=\"wp-image-41455\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/eBook_-Speed-Up-your-website-FR-1024x283-1.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/eBook_-Speed-Up-your-website-FR-1024x283-1.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/eBook_-Speed-Up-your-website-FR-1024x283-1.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/eBook_-Speed-Up-your-website-FR-1024x283-1.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h2 class=\"wp-block-heading\" id=\"h-nouvelles-fonctionnalites-et-mises-a-niveau-de-php-8-1\">Nouvelles fonctionnalit&eacute;s et mises &agrave; niveau de PHP 8.1<\/h2><p>Cette nouvelle version majeure de <strong><a href=\"\/fr\/tutoriels\/quest-ce-que-php\">PHP <\/a><\/strong>introduit plus de 20 nouvelles fonctionnalit&eacute;s. Gardez &agrave; l&rsquo;esprit qu&rsquo;il peut y avoir des changements apr&egrave;s la date de sortie qui peuvent allonger ou raccourcir cette liste.<\/p><p>Voici quelques-unes des nouvelles fonctionnalit&eacute;s de PHP 8.1.<\/p><h3 class=\"wp-block-heading\" id=\"h-enumerations\">&Eacute;num&eacute;rations<\/h3><p>PHP 8.1 supporte les &eacute;num&eacute;rations, ou enum pour faire court. C&rsquo;est un <a href=\"\/fr\/tutoriels\/comment-inserer-des-donnees-dans-une-table-mysql-via-php\">type de donn&eacute;es<\/a> &eacute;num&eacute;r&eacute; qui consiste en un ensemble fixe de valeurs possibles.<\/p><p>La syntaxe utilise <strong>enum <\/strong>pour d&eacute;clarer les &eacute;num&eacute;rations, suivi de son nom d&eacute;fini par l&rsquo;utilisateur. Ensuite, il est suivi de case pour d&eacute;clarer les valeurs possibles. Les &eacute;num&eacute;rations peuvent avoir un nombre quelconque de cas, de z&eacute;ro &agrave; autant que n&eacute;cessaire.<\/p><p>L&rsquo;&eacute;num&eacute;ration RFC utilise des cartes &agrave; jouer standard pour expliquer son fonctionnement. Il y a quatre couleurs fixes &ndash; Pique, C&oelig;ur, Carreau et Tr&egrave;fle. Vous pouvez &eacute;num&eacute;rer ces couleurs avec enum en PHP :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">enum Suit {\n  case Spades;\n  case Hearts;\n  case Diamonds;\n  case Clubs;\n}<\/pre><p>Maintenant, l&rsquo;enum <strong>Suit <\/strong>a quatre valeurs possibles de couleurs de cartes. Vous pouvez <a href=\"\/fr\/tutoriels\/comment-installer-et-utiliser-composer\/\">utiliser une fonction<\/a> et des types d&rsquo;application lorsque vous acceptez ou renvoyez une valeur de couleur avec une syntaxe, par exemple, <code>Suit::Clubs<\/code><\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function pick_card(Suit $suit) {}\npick_card(Suit::Spades);<\/pre><p>Les &eacute;num&eacute;rations peuvent &eacute;galement contenir une valeur facultative de type string ou int. C&rsquo;est ce qu&rsquo;on appelle une Enum adoss&eacute;e, et elle r&eacute;pond aux crit&egrave;res suivants :<\/p><ul class=\"wp-block-list\">\n<li>D&eacute;clarez le type scalaire, qu&rsquo;il s&rsquo;agisse de string ou de int, dans la d&eacute;claration Enum.<\/li>\n\n\n\n<li>Tous les cas ont des valeurs.<\/li>\n\n\n\n<li>Tous les cas contiennent le m&ecirc;me type de scalaire, que ce soit string ou int.<\/li>\n\n\n\n<li>Chaque cas a une valeur unique.<\/li>\n<\/ul><p>Supposons que nous voulions attribuer un score aux costumes de l&rsquo;exemple pr&eacute;c&eacute;dent. Nous pouvons utiliser cette syntaxe :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">enum Suit: string {\n  case Spades = &lsquo;10&rsquo;;\n  case Hearts = &lsquo;8&rsquo;;\n  case Diamonds = &lsquo;5&rsquo;;\n  case Clubs = &lsquo;3&rsquo;;<\/pre><h3 class=\"wp-block-heading\" id=\"h-fibers\">Fibers<\/h3><p>Cette nouvelle fonctionnalit&eacute; introduit l&rsquo;ex&eacute;cution simultan&eacute;e dans la <a href=\"\/fr\/tutoriels\/php-mail\/\">programmation PHP<\/a>. Cependant, l&rsquo;ex&eacute;cution simultan&eacute;e en PHP ne signifie pas que les actions sont ex&eacute;cut&eacute;es en m&ecirc;me temps.<\/p><p>Par exemple, il y a un point o&ugrave; le <a href=\"\/fr\/tutoriels\/do_shortcode-wordpress\">code principal<\/a> va d&eacute;marrer une fibre. Le code &agrave; l&rsquo;int&eacute;rieur de la fibre sera ex&eacute;cut&eacute; s&eacute;par&eacute;ment dans un thread diff&eacute;rent.<\/p><p>De m&ecirc;me, le programme principal ne peut pas suspendre ou terminer les fibres. Seul le code &agrave; l&rsquo;int&eacute;rieur de la fibre peut se suspendre et renvoyer des donn&eacute;es au programme principal. Le programme principal, alors, peut continuer l&rsquo;ex&eacute;cution de la fibre &agrave; partir du point de suspension.<\/p><p>Une pile compl&egrave;te d&rsquo;un programme PHP avec des fibres peut &ecirc;tre compliqu&eacute;e, mais voici un exemple simple d&rsquo;utilisation des fibres dans un programme Echo :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$fiber = new Fiber(function(): void {\n    echo \"Hello from the Fiber\\n\";\n    Fiber::suspend();\n    echo \"Welcome back to the Fiber\\n\";\n});\necho \"Starting the program\\n\";\n$fiber-&gt;start();\necho \"Taken control back\\n\";\necho \"Resuming Fiber\\n\";\n$fiber-&gt;resume();\necho \"Program ends\\n\";<\/pre><p><code>Fiber::suspend()<\/code>&nbsp;est l&rsquo;endroit o&ugrave; la fibre va suspendre son ex&eacute;cution. Ensuite, quand le code principal appelle la fibre &agrave; nouveau avec <code>$fiber-&gt;resume()<\/code>, la fibre commencera &agrave; partir du point de suspension. Par cons&eacute;quent, elle renverra un &eacute;cho de Bienvenue &agrave; la Fiber.<\/p><p>Voici &agrave; quoi devrait ressembler la sortie :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Starting the program\nHello from the Fiber\nTaken control back\nResuming Fiber\nWelcome back to the Fiber\nProgram ends<\/pre><h3 class=\"wp-block-heading\" id=\"h-type-d-intersection-pure\">Type d&rsquo;intersection pure<\/h3><p>PHP 8.1 supporte les types d&rsquo;intersection qui permettent de d&eacute;clarer plusieurs types de classe pour une valeur. A premi&egrave;re vue, cela ressemble aux types union qui ont &eacute;t&eacute; introduits en PHP 8.0. Cependant, il y a une diff&eacute;rence significative.<\/p><p>Les types d&rsquo;union permettent &agrave; la valeur de remplir n&rsquo;importe lequel des types d&eacute;clar&eacute;s. Par exemple, si des cha&icirc;nes et des entiers sont d&eacute;clar&eacute;s, la valeur peut &ecirc;tre soit des cha&icirc;nes, soit des entiers d&eacute;clar&eacute;s.<\/p><p>En revanche, les types d&rsquo;intersection purs n&rsquo;autorisent que les valeurs qui remplissent tous les types d&eacute;clar&eacute;s. C&rsquo;est pourquoi les types d&rsquo;intersection purs ne peuvent utiliser que des types de classe ou d&rsquo;interface, car la plupart des types standard tels que les cha&icirc;nes de caract&egrave;res et les entiers ne peuvent pas &ecirc;tre remplis simultan&eacute;ment.<\/p><p>Pour d&eacute;clarer un type d&rsquo;intersection pure en PHP 8.1, utilisez l&rsquo;op&eacute;rateur <strong>&amp; (AND)<\/strong>. Voici un exemple :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function count_and_iterate(Iterator&amp;\\Countable $value) {\n    foreach($value as $val) {}\n    count($value);\n}<\/pre><p>La valeur <code>$value<\/code> doit &ecirc;tre un objet qui impl&eacute;mente les interfaces Iterator et Countable. Sinon, cela provoquera une erreur de type.<\/p><h3 class=\"wp-block-heading\" id=\"h-jamais-type-de-retour\">jamais Type de retour<\/h3><p>Il y a un nouveau type &laquo;&nbsp;jamais de retour&nbsp;&raquo; en PHP 8.1. Quand un type &nbsp;&raquo; jamais de retour &nbsp;&raquo; est d&eacute;clar&eacute; dans une fonction, celle-ci ne retournera pas de valeur. La fonction doit &eacute;galement se terminer par une instruction de sortie, explicitement ou implicitement.<\/p><p>Voici un exemple d&rsquo;une fonction simple avec le type <code>jamais de retour<\/code> :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function redirect(string $url): never {\n    header('Location: ' . $url);\n    exit();\n}<\/pre><p>Lorsque vous utilisez un type &nbsp;&raquo; jamais de retour &laquo;&nbsp;, le reste du <a href=\"\/fr\/tutoriels\/codeigniter\">code du programme<\/a> ne sera pas ex&eacute;cut&eacute; et ne retournera aucune valeur. Dans la pratique, le type &nbsp;&raquo; jamais de retour &nbsp;&raquo; est utile pour indiquer que la fonction n&rsquo;ex&eacute;cutera pas le reste du code et se terminera ou sera lanc&eacute;e.<\/p><p>D&rsquo;une certaine mani&egrave;re, le type <code>jamais<\/code> de retour est similaire au type <code>void<\/code> de retour. Toutefois, le type <code>void <\/code>return poursuit l&rsquo;ex&eacute;cution apr&egrave;s la fonction.<\/p><h3 class=\"wp-block-heading\" id=\"h-type-array-is-list\">Type array_is_list<\/h3><p>La nouvelle fonction array_is_list de PHP 8.1 vous aide &agrave; voir si un tableau contient des entr&eacute;es qui sont une liste. Elle v&eacute;rifiera les cl&eacute;s du tableau &ndash; si elles sont en ordre s&eacute;quentiel, commencent &agrave; z&eacute;ro, n&rsquo;ont pas d&rsquo;espace, et sont toutes des entiers, elle retournera vrai. Il retournera &eacute;galement vrai par d&eacute;faut pour les tableaux vides.<\/p><p>Par exemple, la fonction <code>array_is_list<\/code> suivante retournera vrai :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">array_is_list([]);\narray_is_list([1, 2, 3]);\narray_is_list([&lsquo;rock&rsquo;, 2, 3]);\narray_is_list([&lsquo;rock&rsquo;, scissor]);\narray_is_list([0 =&gt; 'rock', 'scissor']);\narray_is_list([0 =&gt; 'rock', 1 =&gt; 'scissor']);<\/pre><p>A l&rsquo;inverse, voici des exemples de fonctions <code>array_is_list<\/code> fausses :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">array_is_list([1 =&gt; 'rock', 'scissor']); \/\/ faux, ne commence pas par 0\narray_is_list([1 =&gt; 'rock', 0 =&gt; 'scissor']); \/\/ faux, pas en ordre\narray_is_list([0 =&gt; 'rock', 'suit' =&gt; 'paper']); faux, cl&eacute;s non enti&egrave;res\narray_is_list([0 =&gt; 'rock', 2 =&gt; 'paper']); faux, non s&eacute;quentiel<\/pre><h3 class=\"wp-block-heading\" id=\"h-attribut-returntypewillchange\">Attribut #[ReturnTypeWillChange]<\/h3><p>Ce nouvel attribut indique qu&rsquo;un type de retour provisoire non concordant ne devrait pas entra&icirc;ner une notification de d&eacute;pr&eacute;ciation. Avant PHP 8.0, la syntaxe des attributs &eacute;tait analys&eacute;e comme un commentaire de code afin de ne pas provoquer d&rsquo;erreur de syntaxe.<\/p><p>L&rsquo;ajout de l&rsquo;attribut <code>#[ReturnTypeWillChange]<\/code> &agrave; une m&eacute;thode de classe dans la version PHP 8.1 ne posera aucun probl&egrave;me &ndash; il emp&ecirc;chera seulement la notification de d&eacute;pr&eacute;ciation.<\/p><p>Voici un exemple de <code>#[ReturnTypeWillChange]<\/code> dans un code PHP :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Sample implements ArrayAccess {\n    #[\\ReturnTypeWillChange]\n    public function offsetGet(mixed $offset) {}\n    \/\/ ...\n}<\/pre><p>Notez que cet attribut n&rsquo;aura plus d&rsquo;effet lorsque les types de retour provisoires seront transform&eacute;s en types de retour standard.<\/p><h3 class=\"wp-block-heading\" id=\"h-readonly-proprietes\">readonly Propri&eacute;t&eacute;s<\/h3><p><code>readonly<\/code> est une nouvelle propri&eacute;t&eacute; de classe en PHP 8.1 et ne peut &ecirc;tre initialis&eacute;e qu&rsquo;une seule fois depuis la classe o&ugrave; elle est d&eacute;clar&eacute;e. Toute classe ayant cette propri&eacute;t&eacute; ne sera pas modifiable et provoquera une erreur si vous la forcez &agrave; changer sa valeur.<\/p><p>Voici un exemple de la fa&ccedil;on dont on d&eacute;clare une propri&eacute;t&eacute; <code>readonly <\/code>dans une classe :<\/p><p>Maintenant, puisque le <code>readonly<\/code> a d&eacute;j&agrave; &eacute;t&eacute; initialis&eacute;, vous ne pouvez pas modifier le $authid dans le code.<\/p><p>Si vous essayez de saisir une ligne comme celle-ci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$author-&gt;authid = 15\n<\/pre><p>Il en r&eacute;sultera cette erreur :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Error: Cannot modify readonly property User::$uid in ...:..\n<\/pre><h3 class=\"wp-block-heading\" id=\"h-fonctions-fsync-et-fdatasync\">Fonctions fsync() et fdatasync()<\/h3><p><code>fsync()<\/code> et <code>fdatasync()<\/code> sont de nouveaux ajouts aux fonctions du syst&egrave;me de fichiers en PHP 8.1. Elles ont des similarit&eacute;s avec <code>fflush()<\/code>, qui est utilis&eacute; pour vider les tampons vers le syst&egrave;me d&rsquo;exploitation. Cependant, <code>fsync()<\/code> et <code>fdatasync()<\/code> vident le tampon vers le stockage physique.<\/p><p>La principale diff&eacute;rence entre elles est que la fonction <strong>fsync()<\/strong> inclut les m&eacute;tadonn&eacute;es lors de la synchronisation des modifications des fichiers, alors que la fonction <code>fdatasync()<\/code> ne le fait pas.<\/p><p>Voici un exemple de la fonction <code>fsync()<\/code> dans un code :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$file = 'sample.txt';\n$test = fopen($file, 'h');\nfwrite($test, 'sample data');\nfwrite($test, \"\\r\\n\");\nfwrite($test, 'another data');\nfsync($test);\nfclose($test);<\/pre><p>Vous pouvez utiliser soit <code>fsync()<\/code> soit <code>fdatasync()<\/code> &agrave; la ligne 6. Lorsque la fonction est appel&eacute;e, il est demand&eacute; au syst&egrave;me d&rsquo;exploitation de vider les donn&eacute;es dans la m&eacute;moire.<\/p><p>Ces fonctions sont utiles lorsque le programme a besoin d&rsquo;un stockage coh&eacute;rent des donn&eacute;es. De plus, elles permettent de r&eacute;cup&eacute;rer les donn&eacute;es en cas de panne de l&rsquo;application ou de d&eacute;faillance du syst&egrave;me.<\/p><h3 class=\"wp-block-heading\" id=\"h-fonctions-du-sodium-xchacha20\">Fonctions du sodium XChaCha20<\/h3><p>Sodium est une extension PHP qui contient une biblioth&egrave;que cryptographique. Elle supporte l&rsquo;algorithme de cryptage XChaCha20, un algorithme de chiffrement par flux qui est une variante de ChaCha20.<\/p><p>En PHP 8.1, trois nouvelles fonctions vous permettent de crypter et d&eacute;crypter des donn&eacute;es en utilisant XChaCha20 sans authentification. Cette m&eacute;thode est appel&eacute;e <strong>mode d&eacute;tach&eacute;<\/strong>, et les fonctions sont les suivantes :<\/p><ul class=\"wp-block-list\">\n<li><strong>sodium_crypto_stream_xchacha20sodium_crypto_stream_xchacha20_keygen &ndash; <\/strong>g&eacute;n&egrave;re une cl&eacute; al&eacute;atoire &agrave; utiliser avec la fonction <code>sodium_crypto_stream_xchacha20<\/code>.<\/li>\n\n\n\n<li><strong>sodium_crypto_stream_xchacha20 &ndash; <\/strong>g&eacute;n&egrave;re un flux de cl&eacute;s d&rsquo;octets pseudo-al&eacute;atoires en d&eacute;veloppant le nonce cryptographique et la cl&eacute; g&eacute;n&eacute;r&eacute;e pr&eacute;c&eacute;demment.<\/li>\n\n\n\n<li><strong>sodium_crypto_stream_xchacha20_xor &ndash; <\/strong>crypte un message en utilisant un nonce et une cl&eacute; s&eacute;curis&eacute;e sans authentification.<\/li>\n<\/ul><p>Outre les nouvelles fonctions, deux nouvelles constantes PHP sont d&eacute;finies dans l&rsquo;espace de noms global :<\/p><ul class=\"wp-block-list\">\n<li>SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBITES, affect&eacute; 32.<\/li>\n\n\n\n<li>SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES, affect&eacute; 24.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-nouveau-dans-initialisateurs\">nouveau dans Initialisateurs<\/h3><p>PHP 8.1 permet maintenant d&rsquo;utiliser de nouvelles expressions pour initialiser une valeur dans une d&eacute;claration de fonction.<\/p><p>En utilisant PHP 8.0, nous devons initialiser la valeur d&rsquo;un param&egrave;tre optionnel en dehors du constructeur. Bien que cela fonctionne tr&egrave;s bien, cela rend le code un peu plus long. Voici un exemple tir&eacute; du nouveau<strong><a href=\"https:\/\/wiki.php.net\/rfc\/new_in_initializers\" target=\"_blank\" rel=\"noopener\"> RFC<\/a><\/strong> :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Test {\n    private Logger $logger;\n    public function __construct(\n        ?Logger $logger = null,\n    ) {\n        $this-&gt;logger = $logger ?? new NullLogger;\n    }\n}<\/pre><p>En PHP 8.1, nous pouvons simplement l&rsquo;&eacute;crire comme ceci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Test {\n    public function __construct(\n        private Logger $logger = new NullLogger,\n    ) {}\n}<\/pre><h3 class=\"wp-block-heading\" id=\"h-prise-en-charge-du-deballage-de-tableaux-a-cle-de-caracteres\">Prise en charge du d&eacute;ballage de tableaux &agrave; cl&eacute; de caract&egrave;res<\/h3><p>La version pr&eacute;c&eacute;dente de PHP a ajout&eacute; le support de l&rsquo;op&eacute;rateur d&rsquo;&eacute;talement de tableau (&hellip;). Il fonctionne pour le d&eacute;paquetage des tableaux et comme alternative &agrave; la fonction <code>array_merge()<\/code>.<\/p><p>Toutefois, l&rsquo;op&eacute;rateur d&rsquo;&eacute;talement ne prenait en charge que les touches num&eacute;riques. L&rsquo;utilisation de l&rsquo;op&eacute;rateur ou de la fonction pour les tableaux de cha&icirc;nes de caract&egrave;res entra&icirc;nerait une erreur.<\/p><p>PHP 8.1 supporte maintenant le d&eacute;ballage des tableaux pour les tableaux &agrave; cl&eacute;s. Supposons que vous ayez ces tableaux :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$array_1 = ['a', 'b'];\n$array_2 = ['c', 'd'];<\/pre><p>Vous pouvez d&eacute;compresser les cl&eacute;s du tableau en utilisant l&rsquo;op&eacute;rateur d&rsquo;&eacute;talement.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$array = [...$array1, ...$array2];\nvar_dump($array);\n\/\/['a', 'b', 'c', 'd'];<\/pre><p>Ou bien, d&eacute;compressez les cl&eacute;s du tableau en utilisant la fonction <code>array_merge()<\/code> :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$array = array_merge($array1, $array2);\nvar_dump($array);\n\/\/['a', 'b', 'c', 'd'];<\/pre><h3 class=\"wp-block-heading\" id=\"h-syntaxe-appelable-de-premiere-classe\">Syntaxe appelable de premi&egrave;re classe<\/h3><p>PHP 8.1 introduit une nouvelle syntaxe de callable de premi&egrave;re classe pour <a href=\"\/fr\/tutoriels\/creer-afficher-phpinfo\">cr&eacute;er un callable<\/a> &agrave; l&rsquo;int&eacute;rieur de la port&eacute;e courante.<\/p><p>Avant PHP 8.1, la syntaxe d&rsquo;un appelable utilise <code>Closure::fromCallable<\/code>, comme ceci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$callable = Closure:: fromCallable(&lsquo;hostinger&rsquo;);\n<\/pre><p>Gr&acirc;ce &agrave; la nouvelle syntaxe, vous pouvez utiliser <code>(&hellip;)<\/code> apr&egrave;s l&rsquo;objet au lieu d&rsquo;utiliser <code>Closure::from Callable<\/code>. Cela facilite la cr&eacute;ation d&rsquo;un callable de premi&egrave;re classe. Voici un exemple de la fonction ci-dessus utilisant la nouvelle syntaxe :<\/p><h3 class=\"wp-block-heading\" id=\"h-nouvelle-classe-intldatepatterngenerator\">Nouvelle classe IntlDatePatternGenerator<\/h3><p>Dans la version pr&eacute;c&eacute;dente de PHP, vous pouvez cr&eacute;er une date et une heure localis&eacute;es uniquement avec le format pr&eacute;d&eacute;fini IntlDateFormatter. Il y a huit formats pr&eacute;d&eacute;finis &ndash; quatre formats de base et quatre variantes relatives qui utilisent <strong>hier, aujourd&rsquo;hui<\/strong> et <strong>demain<\/strong>.<\/p><p>Bien que ces options soient raisonnables, elles ne sont pas aussi <strong>personnalisables <\/strong>qu&rsquo;en PHP 8.1.<\/p><p>La nouvelle classe <code>IntlDatePatternGenerator <\/code>vous permet de sp&eacute;cifier le format d&rsquo;une date, d&rsquo;un mois et d&rsquo;une heure. L&rsquo;ordre exact peut &ecirc;tre laiss&eacute; au formateur.<\/p><p>Voici un exemple de son utilisation tir&eacute; de la <strong><a href=\"https:\/\/wiki.php.net\/rfc\/intldatetimepatterngenerator\" target=\"_blank\" rel=\"noopener\">RFC IntlDatePatternGenerator <\/a><\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$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*\/<\/pre><p>La variable squelette sp&eacute;cifie le format de date et d&rsquo;heure <strong>YYYYMMDD<\/strong>, tandis que le formateur sp&eacute;cifie l&rsquo;ordre final. Dans le code ci-dessus, nous obtenons deux r&eacute;sultats diff&eacute;rents du formateur. Cependant, la date utilise toujours le format <strong>YYYYMMDD<\/strong>.<\/p><h3 class=\"wp-block-heading\" id=\"h-final-class-constants\">final Class Constants<\/h3><p>D&eacute;clarer le nouveau drapeau <code>final <\/code>sur les constantes de classe les emp&ecirc;che d&rsquo;&ecirc;tre surcharg&eacute;es ou &eacute;tendues par des sous-classes.<\/p><p>Si vous essayez d&rsquo;&eacute;tendre ou de remplacer une classe final, une erreur fatale se produira. Voici un exemple :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class First {\n    final public const TEST = '1';\n}\nclass Second extends First {\n    public const TEST = '2';\n}<\/pre><p>Il en r&eacute;sultera :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Fatal error: Second::TEST cannot override final constant First::TEST in %s on line %d\n<\/pre><p>Cet indicateur ne peut pas &ecirc;tre utilis&eacute; pour une constante <code>private<\/code> car elle ne peut pas &ecirc;tre acc&eacute;d&eacute;e en dehors de la classe. D&eacute;clarer &agrave; la fois les constantes <code>final<\/code> et <code>private<\/code> entra&icirc;nera une erreur fatale.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class First {\n    final private const TEST = '1';\nFatal error: Private constant First::TEST cannot be final as it is never overridden in ... on line ...<\/pre><h3 class=\"wp-block-heading\" id=\"h-notation-explicite-des-chiffres-octaux\">Notation explicite des chiffres octaux<\/h3><p>PHP supporte plusieurs syst&egrave;mes num&eacute;riques, comme le <strong>d&eacute;cimal par d&eacute;faut (base 10)<\/strong>, le <strong>binaire (base 2)<\/strong>, <strong>l&rsquo;octal (base 8)<\/strong> et <strong>l&rsquo;hexa (base 16)<\/strong>. Cependant, les syst&egrave;mes num&eacute;riques autres que le d&eacute;cimal doivent utiliser les pr&eacute;fixes suivants :<\/p><ul class=\"wp-block-list\">\n<li><strong>Hexa&nbsp;<\/strong>&ndash; 0x<\/li>\n\n\n\n<li><strong>B<strong>inaire<\/strong>&nbsp;<\/strong>&ndash; 0b<\/li>\n\n\n\n<li><strong>Octal&nbsp;<\/strong>&ndash; 0<\/li>\n<\/ul><p>PHP 8.1 introduit les pr&eacute;fixes <strong>o (minuscule)<\/strong> et <strong>O (majuscule)<\/strong> pour les chiffres octaux. Cela signifie que les chiffres octaux sont maintenant plus apparents et plus lisibles.<\/p><p>Regardez ces exemples :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">echo 77; \/\/ 77, numeric string\necho 077; \/\/ 63, old-format octal numeral\necho 0o77; \/\/ 63, octal numeral in PHP 8.1<\/pre><p>Notez que ce nouveau pr&eacute;fixe est juste un ajout. Le pr&eacute;fixe <strong>0 <\/strong>existant fonctionnera de la m&ecirc;me mani&egrave;re en PHP 8.1.<\/p><h3 class=\"wp-block-heading\" id=\"h-valeur-full-path-de-files-pour-les-telechargements-de-repertoires\">Valeur full_path de $_Files pour les t&eacute;l&eacute;chargements de r&eacute;pertoires<\/h3><p><code>$_FILES<\/code> est une super variable globale contenant les noms, tailles, et types MIME des fichiers t&eacute;l&eacute;charg&eacute;s.<\/p><p>Dans la version ant&eacute;rieure de PHP 8.1, <code>$_FILES<\/code> ne stockait pas les chemins relatifs ou le r&eacute;pertoire exact sur le serveur. Par cons&eacute;quent, vous ne pouviez pas t&eacute;l&eacute;charger un r&eacute;pertoire entier avec un formulaire HTML de t&eacute;l&eacute;chargement de fichiers.<\/p><p>La nouvelle cl&eacute; <code>full_path<\/code> r&eacute;sout le probl&egrave;me. Elle stocke les chemins relatifs et reconstruit la structure exacte du r&eacute;pertoire sur le serveur, ce qui rend possible le t&eacute;l&eacute;chargement de r&eacute;pertoires.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var_dump($_FILES);\narray(1) {\n  [\"myupload\"]=&gt; array(6) {\n    [\"name\"]=&gt; array(2) {\n      [0]=&gt; string(8) \"file.txt\"\n      [1]=&gt; string(8) \"file.txt\"\n    }\n    [\"full_path\"]=&gt; array(2) {\n      [0]=&gt; string(19) \"foo\/test1\/file.txt\"\n      [1]=&gt; string(19) \"foo\/test2\/file.txt\"\n    }\n    [\"tmp_name\"]=&gt; array(2) {\n      [0]=&gt; string(14) \"\/tmp\/phpV1J3EM\"\n      [1]=&gt; string(14) \"\/tmp\/phpzBmAkT\"\n    }\n    \/\/ ... + error, type, size\n  }\n}<\/pre><p>Dans l&rsquo;exemple ci-dessus, il y a deux <strong>file.txt<\/strong> diff&eacute;rents, mais ils sont stock&eacute;s dans des r&eacute;pertoires diff&eacute;rents. Si vous utilisez le tableau <code>$_FILES[\"myupload\"][\"name\"]<\/code>, il y aura des entr&eacute;es en double, car les deux fichiers sont sp&eacute;cifi&eacute;s avec le m&ecirc;me nom.<\/p><p>Cependant, le tableau <code>$_FILES[\"myupload\"][\"full_path\"]<\/code> contient le chemin d&rsquo;acc&egrave;s de chaque fichier. Cela &eacute;vite la duplication qui se produit dans le tableau pr&eacute;c&eacute;dent.<\/p><h3 class=\"wp-block-heading\" id=\"h-encodage-lossless-webp-et-prise-en-charge-de-gdimage\">Encodage Lossless WebP et prise en charge de GdImage<\/h3><p>En PHP 8.1, il y a un nouveau support du codage <strong>WebP <\/strong>lossless pour l&rsquo;objet <strong>GdImage<\/strong>. Il peut &ecirc;tre activ&eacute; en utilisant l&rsquo;<strong>extension GD <\/strong>et la version 0.2.0 de <strong>libwebp<\/strong>.<\/p><p>La nouvelle constante PHP pour d&eacute;clarer le codage WebP lossless est <code>IMG_WEBP_LOSSLESS<\/code>, avec la fonction <code>imagewebp<\/code>. Dans un code PHP, cela ressemble &agrave; ceci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$image = imagecreatefromjpeg('image.jpg');\nimagewebp($image, 'image.webp', IMG_WEBP_LOSSLESS);<\/pre><h3 class=\"wp-block-heading\" id=\"h-support-des-images-avif\">Support des images AVIF<\/h3><p>En plus du support de <strong>WebP<\/strong>, PHP 8.1 &ndash; en utilisant l&rsquo;extension GD, supporte &eacute;galement le format d&rsquo;image AVIF. C&rsquo;est un format d&rsquo;image relativement nouveau, bas&eacute; sur le format vid&eacute;o <strong>AV1<\/strong>. Il offre une meilleure compression et est libre de droits.<\/p><p>Afin d&rsquo;ajouter le support des images <strong>AVIF <\/strong>au traitement des images PHP, vous devez compiler l&rsquo;extension GD avec le support <strong>AVIF<\/strong>. Vous aurez &eacute;galement besoin de la version 0.8.2 ou sup&eacute;rieure de <strong>libavid <\/strong>pour l&rsquo;<strong>extension GD<\/strong>.<\/p><p>En fonction de votre syst&egrave;me d&rsquo;exploitation, ex&eacute;cutez les commandes suivantes :<\/p><ul class=\"wp-block-list\">\n<li><strong>Ubuntu\/Debian&nbsp;<\/strong>&ndash;&nbsp;<code>apt install libavif-dev<\/code><\/li>\n\n\n\n<li><strong>RHEL\/Fedora&nbsp;<\/strong>&ndash;&nbsp;<code>dnf install libavif-devel<\/code><\/li>\n<\/ul><p>L&rsquo;&eacute;tape suivante consiste &agrave; utiliser l&rsquo;option <code>--with-avif flag<\/code> avec le script <code>.\/configure<\/code> pour compiler PHP avec le support <strong>AVIF<\/strong>.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.\/buildconf --force\n.\/configure --enable-gd --with-avif<\/pre><p>Ensuite, ex&eacute;cutez la commande suivante pour v&eacute;rifier si le support <strong>AVIF <\/strong>est maintenant activ&eacute; :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">php -i | grep AVIF\nIf it&rsquo;s enabled, you should see this output:\nAVIF Support =&gt; enabled<\/pre><h3 class=\"wp-block-heading\" id=\"h-prise-en-charge-de-dns-over-https\">Prise en charge de DNS-over-HTTPS<\/h3><p>DNS-over-HTTPS augmente la confidentialit&eacute; et la s&eacute;curit&eacute; en ex&eacute;cutant la r&eacute;solution DNS via le protocole HTTPS. Il crypte les donn&eacute;es envoy&eacute;es par l&rsquo;ordinateur client au r&eacute;solveur DNS.<\/p><p>L&rsquo;extension <strong>Curl <\/strong>de <strong>PHP 8.1<\/strong> permet maintenant de sp&eacute;cifier un serveur pour le protocole DNS-over-HTTPS. Pour utiliser cette nouvelle fonctionnalit&eacute;, vous devez compiler PHP avec <strong>libcurl 7.62<\/strong> ou plus. Cela dit, la plupart des syst&egrave;mes d&rsquo;exploitation utilisent d&eacute;j&agrave; <strong>Curl 7.68<\/strong>, donc cela ne devrait pas &ecirc;tre un probl&egrave;me.<\/p><p>Pour sp&eacute;cifier le DNS-over-HTTPS, utilisez l&rsquo;option CURLOPT_DOH_URL.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ch = curl_init('https:\/\/website.com');\ncurl_setopt($ch, CURLOPT_DOH_URL, 'https:\/\/dns.google\/dns-query');\ncurl_exec($ch);<\/pre><p>Notez que l&rsquo;URL du serveur doit &ecirc;tre une URL HTTPS, et qu&rsquo;elle sera valid&eacute;e lors de l&rsquo;ex&eacute;cution de la demande. La demande &eacute;chouera si l&rsquo;URL du serveur DNS n&rsquo;est pas valide ou ne fournit pas de r&eacute;ponse valide.<\/p><p>Nous avons utilis&eacute; le serveur DNS public de Google dans l&rsquo;exemple ci-dessus, mais vous pouvez &eacute;galement choisir n&rsquo;importe quel autre serveur DNS-over-HTTPS public.<\/p><h3 class=\"wp-block-heading\" id=\"h-classe-curlstringfile\">Classe CurlStringFile<\/h3><p>L&rsquo;extension Curl comporte une nouvelle classe CURLStringFile qui fonctionne de mani&egrave;re similaire &agrave; la classe CURLFile pour les t&eacute;l&eacute;chargements de fichiers. Toutefois, la classe CURLFile n&rsquo;accepte qu&rsquo;une URI ou un chemin d&rsquo;acc&egrave;s au fichier, tandis que CURLStringFile accepte le contenu du fichier au lieu d&rsquo;un chemin d&rsquo;acc&egrave;s ou d&rsquo;une URI.<\/p><p>Gr&acirc;ce &agrave; la nouvelle classe PHP 8.1, il est plus facile de cr&eacute;er une requ&ecirc;te de t&eacute;l&eacute;chargement de fichier en utilisant des donn&eacute;es stock&eacute;es en m&eacute;moire. Par exemple, utilisez-la pour t&eacute;l&eacute;charger une image trait&eacute;e en PHP ou stock&eacute;e dans une variable PHP.<\/p><p>Voici un exemple d&rsquo;utilisation du <code>CURLStringFile<\/code> dans un code PHP :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$txt = 'test content';\n$txt_curlfile = new \\CURLStringFile($txt, 'text\/plain', 'test.txt');\n$ch = curl_init('http:\/\/website.com\/upload.php');\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, ['file' =&gt; $txt_curlfile]);\ncurl_exec($ch);<\/pre><h3 class=\"wp-block-heading\" id=\"h-support-des-algorithmes-pour-les-hachages-murmurhash3-et-xxhash\">Support des algorithmes pour les hachages MurmurHash3 et xxHash<\/h3><p>PHP 8.1 introduit le support de deux algorithmes de hachage non-cryptographiques &ndash; <strong>MurmurHash3<\/strong> et <strong>xxHash<\/strong>. Les hachages non cryptographiques sont plus rapides que la plupart des algorithmes de hachage actuels de PHP, tout en offrant une grande dispersion et un caract&egrave;re al&eacute;atoire.<\/p><p><strong>MurmurHash3<\/strong><\/p><p>Pour MurmurHash3, voici les variantes support&eacute;es :<\/p><ul class=\"wp-block-list\">\n<li><code>murmur3a<\/code>&nbsp;&ndash; 32-bit hash<\/li>\n\n\n\n<li><code>murmur3c<\/code>&nbsp;&ndash; 128-bit hash sur architecture x86<\/li>\n\n\n\n<li><code>murmur3f<\/code> &ndash; 128-bit hash sur architecture x64<\/li>\n<\/ul><p>Pour hacher une cha&icirc;ne de caract&egrave;res en utilisant MurmurHash3, utilisez une syntaxe comme celle-ci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">hash(&lsquo;murmur3a&rsquo;, &lsquo;hash_example&rsquo;);\nhash(&lsquo;murmur3c&rsquo;, &lsquo;hash_example&rsquo;);\nhash(&lsquo;murmur3f&rsquo;, &lsquo;hash_example&rsquo;);<\/pre><p>Vous pouvez mettre &agrave; jour les valeurs en s&eacute;quence sans hacher la cha&icirc;ne d&rsquo;entr&eacute;e dans son ensemble. C&rsquo;est ce qu&rsquo;on appelle le streaming hash.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$context = hash_init(&lsquo;murmur3a&rsquo;);\nhash_update($context, 'hash');\nhash_update($context, '_');\nhash_update($context, &lsquo;example');\n$hash = hash_final($context);<\/pre><p><strong>xxHash<\/strong><\/p><p>PHP 8.1 supporte l&rsquo;algorithme xxHash suivant :<\/p><ul class=\"wp-block-list\">\n<li><strong>xxh32<\/strong>&nbsp;&ndash; Sortie de hach 32-bit<\/li>\n\n\n\n<li><strong>xxh64<\/strong>&nbsp;&ndash; Sortie de hach 64-bit<\/li>\n\n\n\n<li><strong>xxh3<\/strong>&nbsp;&ndash; Sortie de hach 64-bit<\/li>\n\n\n\n<li><strong>xxh128<\/strong>&nbsp;&ndash; Sortie de hach 128-bit<\/li>\n<\/ul><p>Voici la syntaxe pour hacher une cha&icirc;ne de caract&egrave;res &agrave; l&rsquo;aide de xxHash :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">hash(&lsquo;xxh32&rsquo;, &lsquo;hash_example&rsquo;);\nhash(&lsquo;xxh64&rsquo;, &lsquo;hash_example&rsquo;);\nhash(&lsquo;xxh3&rsquo;, &lsquo;hash_example&rsquo;);\nhash(&lsquo;xxh128&rsquo;, &lsquo;hash_example&rsquo;);<\/pre><p>Semblable &agrave; MurmurHash3, xxHash est &eacute;galement un streaming hash qui vous permet de mettre &agrave; jour les valeurs en s&eacute;quence.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$context = hash_init(&lsquo;xxh32&rsquo;);\nhash_update($context, 'hash');\nhash_update($context, '_');\nhash_update($context, &lsquo;example');\n$hash = hash_final($context);<\/pre><h3 class=\"wp-block-heading\" id=\"h-amelioration-des-performances\">Am&eacute;lioration des performances<\/h3><p>PHP 8.1 ajoute une nouvelle fonctionnalit&eacute; pour supprimer la surcharge de l&rsquo;h&eacute;ritage des classes, le <strong>cache d&rsquo;h&eacute;ritage<\/strong>.<\/p><p>Pr&eacute;c&eacute;demment, l&rsquo;opcache compilait et mettait en cache les classes PHP s&eacute;par&eacute;ment. Ensuite, il liait ces classes &agrave; l&rsquo;ex&eacute;cution lors de chaque requ&ecirc;te.<\/p><p>Le processus de liaison n&eacute;cessite des contr&ocirc;les de compatibilit&eacute; et l&rsquo;emprunt de m&eacute;thodes, de propri&eacute;t&eacute;s ou de constantes aux classes et traits parents. Cela ralentit l&rsquo;ex&eacute;cution, bien que le r&eacute;sultat soit le m&ecirc;me pour chaque requ&ecirc;te.<\/p><p>Le nouveau <strong>cache d&rsquo;h&eacute;ritage<\/strong> r&eacute;sout ce probl&egrave;me en liant toutes les classes d&eacute;pendantes uniques et en les enregistrant dans la m&eacute;moire mutualis&eacute;e de l&rsquo;opcache. Ce patch supprime &eacute;galement les limitations pour les classes immuables &ndash; toutes les classes stock&eacute;es dans l&rsquo;opcache sont maintenant immuables.<\/p><p>Cela se traduit par une diminution du nombre d&rsquo;instructions pour chaque requ&ecirc;te et une am&eacute;lioration de 8 <strong>%<\/strong> pour l&rsquo;application Symfony &laquo;&nbsp;<strong>Hello, World !<\/strong>&laquo;&nbsp;.<\/p><h3 class=\"wp-block-heading\" id=\"h-constante-mysql-i-refresh-replica\">Constante MySQL_I_REFRESH_Replica<\/h3><p>MySQLi introduit une nouvelle constante pour PHP 8.1 appel&eacute;e <code>MYSQLI_REFRESH_REPLICA<\/code>. Cette constante a la m&ecirc;me fonctionnalit&eacute; que la constante existante <code>MYSQLI_REFRESH_SLAVE<\/code>.<\/p><p>Le nouveau nom r&eacute;pond &agrave; l&rsquo;insensibilit&eacute; raciale concernant la terminologie <strong>d&rsquo;esclave<\/strong>. Cependant, la constante existante <code>MYSQLI_REFRESH_SLAVE<\/code> ne sera pas supprim&eacute;e ou d&eacute;pr&eacute;ci&eacute;e en PHP 8.1.<\/p><h2 class=\"wp-block-heading\" id=\"h-changements-dans-php-8-1\">Changements dans PHP 8.1<\/h2><p>PHP 8.1 introduit quelques changements dans la syntaxe et les fonctionnalit&eacute;s. La plupart d&rsquo;entre eux ne modifient pas de mani&egrave;re significative les fonctionnalit&eacute;s existantes, mais vous devez &ecirc;tre conscient de ces changements si vous continuez &agrave; utiliser une application PHP existante sur PHP 8.1.<\/p><h3 class=\"wp-block-heading\" id=\"h-les-fonctions-de-codage-decodage-html-convertissent-les-guillemets-simples-et-les-substituent-par-defaut\">Les fonctions de codage\/d&eacute;codage HTML convertissent les guillemets simples et les substituent par d&eacute;faut<\/h3><p>PHP 8.1 apporte des modifications aux fonctions qui d&eacute;codent et encodent les entit&eacute;s HTML. L&rsquo;entit&eacute; HTML est une repr&eacute;sentation textuelle d&rsquo;un caract&egrave;re dans le code HTML. Des exemples courants d&rsquo;entit&eacute;s HTML sont les caract&egrave;res &lt; et &gt; qui composent les balises HTML telles que <code>&lt;h1&gt;<\/code> ou <code>&lt;b&gt;<\/code><\/p><p>Le navigateur interpr&eacute;tera ces caract&egrave;res comme du code HTML si vous les utilisez dans un document HTML. Par cons&eacute;quent, si vous voulez que le navigateur les affiche dans leur forme originale, vous devez utiliser leurs entit&eacute;s HTML.<\/p><p>Par exemple, vous voulez que le navigateur rende<br>comme un texte. Vous l&rsquo;&eacute;crivez donc dans le document HTML sous la forme <strong>1&amp;gt. &amp;lt ; <\/strong>et <strong>&amp;gt ;<\/strong> repr&eacute;sentent respectivement <strong>&lt;<\/strong> et <strong>&gt;<\/strong>.<\/p><p>PHP poss&egrave;de quelques fonctions pour convertir les caract&egrave;res HTML en entit&eacute;s HTML :<\/p><ul class=\"wp-block-list\">\n<li><strong>htmlspecialchars<\/strong>&nbsp;&ndash; convertit les caract&egrave;res sp&eacute;ciaux en entit&eacute;s HTML.<\/li>\n\n\n\n<li><strong>htmlspecialchars_decode<\/strong>&nbsp;&ndash; convertit les entit&eacute;s HTML en caract&egrave;res sp&eacute;ciaux.<\/li>\n\n\n\n<li><strong>htmlentities<\/strong>&nbsp;&ndash; convertit les caract&egrave;res applicables en entit&eacute;s HTML<\/li>\n\n\n\n<li><strong>html_entitity_decode<\/strong>&nbsp;&ndash; convertit les entit&eacute;s HTML en leurs caract&egrave;res apparent&eacute;s.<\/li>\n\n\n\n<li><strong>get_html_translation_table<\/strong>&nbsp;&ndash; renvoie la table de traduction pour les fonctions <code>htmlspecialchars<\/code> et <code>htmlentities<\/code>.<\/li>\n<\/ul><p>Dans les versions pr&eacute;c&eacute;dentes de PHP, ces fonctions ne convertissaient pas les guillemets simples (&lsquo;) et retournaient une cha&icirc;ne vide. Cela a chang&eacute; en PHP 8.1, car elles convertissent maintenant les guillemets simples en leur entit&eacute; HTML, <strong>&amp;apos<\/strong> ;.<\/p><p>Le changement s&rsquo;effectue en rempla&ccedil;ant la signature <code>ENT_COMPAT<\/code> dans les fonctions par <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code>. Voici la nouvelle syntaxe :<\/p><ul class=\"wp-block-list\">\n<li><code>htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE);<\/code><\/li>\n\n\n\n<li><code>htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);<\/code><\/li>\n\n\n\n<li><code>htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);<\/code><\/li>\n\n\n\n<li><code>html_entity_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);<\/code><\/li>\n\n\n\n<li><code>get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES | ENT_SUBSTITUTE);<\/code><\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-le-shell-interactif-necessite-l-extension-readline\">Le shell interactif n&eacute;cessite l&rsquo;extension Readline<\/h3><p>Dans les versions pr&eacute;c&eacute;dentes de PHP, il est possible d&rsquo;ouvrir le shell interactif avec l&rsquo;option php -a. Cependant, les fonctionnalit&eacute;s interactives n&rsquo;&eacute;taient pas activ&eacute;es car elles n&eacute;cessitent l&rsquo;extension readline.<\/p><p>Par cons&eacute;quent, l&rsquo;option php -a n&rsquo;avait aucun sens et revenait &agrave; ouvrir un shell non interactif &agrave; l&rsquo;aide de la commande php.<\/p><p>Ce probl&egrave;me est maintenant corrig&eacute; dans PHP 8.1. L&rsquo;utilisation de l&rsquo;option php -a dans la ligne de commande sans l&rsquo;extension readline activ&eacute;e retournera un message d&rsquo;erreur.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">php -a\nInteractive shell (-a) requires the readline extension.<\/pre><p>Cependant, si vous avez activ&eacute; l&rsquo;extension, elle ouvrira le shell interactif.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">php -a\nInteractive shell\nphp &gt;\nphp &gt; echo \"Hello\";\nHello\nphp &gt; function test() {\nphp { echo \"Hello\";\nphp { }\nphp &gt; test();\nHello<\/pre><h3 class=\"wp-block-heading\" id=\"h-le-mode-d-erreur-par-defaut-de-mysqli-est-regle-sur-exceptions\">Le mode d&rsquo;erreur par d&eacute;faut de MySQLi est r&eacute;gl&eacute; sur Exceptions<\/h3><p>Avant PHP 8.1, le traitement par d&eacute;faut des erreurs de MySQLi &eacute;tait de les r&eacute;duire au silence. Les d&eacute;veloppeurs devaient d&eacute;finir leurs fonctions de gestion des erreurs, ou le code ne suivait pas la gestion stricte des erreurs.<\/p><p>En PHP 8.1, la gestion des erreurs par d&eacute;faut est d&eacute;finie pour lancer une exception.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT<\/pre><p>Il s&rsquo;agit d&rsquo;un changement de rupture et, comme la valeur est diff&eacute;rente, cela causera un probl&egrave;me de compatibilit&eacute;. Toutefois, vous pouvez r&eacute;soudre ce probl&egrave;me en d&eacute;finissant explicitement la gestion des erreurs &agrave; l&rsquo;aide de la fonction <code>MYSQLI_REPORT<\/code> avant d&rsquo;&eacute;tablir la premi&egrave;re connexion MySQLi.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysqli_report(MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT);<\/pre><h3 class=\"wp-block-heading\" id=\"h-fin-de-ligne-personnalisable-pour-les-fonctions-d-ecriture-csv\">Fin de ligne personnalisable pour les fonctions d&rsquo;&eacute;criture CSV<\/h3><p>Dans les versions pr&eacute;c&eacute;dentes de PHP, les fonctions <strong>fputcsv()<\/strong> et <strong>SplFileObject::fputcsv<\/strong> sont cod&eacute;es en dur avec le caract&egrave;re de fin de ligne &laquo;&nbsp;\\<strong>n<\/strong>&laquo;&nbsp;. PHP 8.1 introduit une nouvelle fonction <strong>eol<\/strong> qui permet de personnaliser les caract&egrave;res de fin de ligne.<\/p><p>Toutefois, ce param&egrave;tre est optionnel, et la fonction utilisera toujours &laquo;&nbsp;\\<strong>n<\/strong>&nbsp;&raquo; par d&eacute;faut. Si vous avez un code ou une application existante qui ne d&eacute;finit pas explicitement un caract&egrave;re de fin de ligne, il utilisera toujours &laquo;&nbsp;\\<strong>n<\/strong>&laquo;&nbsp;.<\/p><p>Si vous souhaitez utiliser le param&egrave;tre <code>eol <\/code>pour un caract&egrave;re de fin de ligne personnalis&eacute;, voici un exemple de syntaxe :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function fputcsv($stream, array $fields, string $separator = \",\", string $enclosure = \"\\\"\", string $escape = \"\\\\\", string  $eol = \"\\n\"): int|false {}\npublic function fputcsv(array $fields, string $separator = \",\", string $enclosure = \"\\\"\", string $escape = \"\\\\\", string  $eol = \"\\n\") {}<\/pre><p>Notez que vous devez utiliser des guillemets doubles avec les caract&egrave;res de fin de ligne tels que <strong>\\r<\/strong>, <strong>\\n<\/strong>, ou <strong>\\r\\n<\/strong> afin qu&rsquo;ils soient interpr&eacute;t&eacute;s correctement.<\/p><h3 class=\"wp-block-heading\" id=\"h-fonction-compacte-appels-d-alerte\">Fonction compacte Appels d&rsquo;alerte<\/h3><p>La fonction compacte est utile pour cr&eacute;er un tableau qui contient des variables et leurs valeurs. Voici un exemple de fonction compacte :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$low_cost = &lsquo;Shared hosting&rsquo;;\n$mid_cost = &lsquo;VPS hosting&rsquo;;\n$high_cost = &lsquo;Dedicated hosting&rsquo;;\ncompact (&lsquo;low_cost&rsquo;, &lsquo;mid_cost&rsquo;, &lsquo;high_cost&rsquo;);\n\/\/[low_cost&rsquo; =&gt; &ldquo;Shared hosting&rdquo;, &lsquo;mid_cost&rsquo; =&gt; &ldquo;VPS hosting&rdquo;, &lsquo;high_cost&rsquo; =&gt; &ldquo;Dedicated hosting&rdquo;]<\/pre><p>Dans sa documentation, la fonction compact n&rsquo;accepte que des param&egrave;tres de type cha&icirc;ne ou des tableaux contenant des valeurs de type cha&icirc;ne. Cependant, il peut sembler qu&rsquo;elle accepte des param&egrave;tres autres que des cha&icirc;nes et des tableaux, mais en r&eacute;alit&eacute; elle les ignore.<\/p><p>Si vous d&eacute;clarez des types stricts avec <code>declare(strict_types=1)<\/code>, la fonction n&rsquo;effectuera pas non plus de v&eacute;rification des types stricts.<\/p><p>Cela a chang&eacute; en PHP 8.1, car la fonction compacte affiche maintenant un avertissement si l&rsquo;argument contient une non-valeur ou un tableau qui n&rsquo;est pas constitu&eacute; de cl&eacute;s de type cha&icirc;ne.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">compact(null);\n\/\/ []\nPHP Warning:  compact(): Argument #1 must be string or array of strings, null given in ... on line &hellip;<\/pre><p>Cela dit, la d&eacute;claration de types stricts n&rsquo;aura pas d&rsquo;impact, et la fonction ne lancera toujours pas d&rsquo;erreur de type.<\/p><h3 class=\"wp-block-heading\" id=\"h-l-algorithme-de-signature-de-phar-est-passe-de-sha1-a-sha256\">L&rsquo;algorithme de signature de Phar est pass&eacute; de SHA1 &agrave; SHA256<\/h3><p>L&rsquo;extension <strong>Phar <\/strong>est utilis&eacute;e pour emballer une application PHP dans un fichier d&rsquo;archive <strong>Phar<\/strong>. Ce fichier peut ensuite &ecirc;tre ex&eacute;cut&eacute; dans n&rsquo;importe quel environnement PHP.<\/p><p>Chaque fichier <strong>Phar <\/strong>contient une signature pour v&eacute;rifier l&rsquo;int&eacute;grit&eacute; du fichier avant son ex&eacute;cution. L&rsquo;algorithme de signature par d&eacute;faut pour le fichier <strong>Phar <\/strong>&eacute;tait auparavant <strong>SHA1<\/strong>. Cependant, dans PHP 8.1, cela change en <strong>SHA256<\/strong>.<\/p><p>Vous pouvez modifier l&rsquo;algorithme de signature en utilisant <code>Phar::setSignatureAlgorithm<\/code> et en s&eacute;lectionnant <strong>MD5, SHA1, SHA256<\/strong> ou <strong>SHA512<\/strong>. Voici un extrait de code &agrave; ce sujet :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$filename = 'test.phar';\n$phar = new Phar($filename);\n$phar-&gt;buildFromDirectory('src\/');\n$phar-&gt;setDefaultStub('index.php', '\/index.php');\n$phar-&gt;setSignatureAlgorithm(Phar::SHA512);<\/pre><p>Notez que toutes les versions de PHP depuis 5.3 supportent l&rsquo;algorithme<strong> SHA256<\/strong>. Cela signifie que tous les fichiers <strong>Phar <\/strong>g&eacute;n&eacute;r&eacute;s avec PHP 8.1 seront toujours compatibles avec les anciennes versions. Cependant, deux nouveaux algorithmes de signature &ndash; <strong>OpenSSL-256<\/strong> et <strong>OpenSSL-512<\/strong> &ndash; sont incompatibles avec les anciennes versions de PHP.<\/p><h3 class=\"wp-block-heading\">Impl&eacute;mentation de JsonSerializable dans SplFixedArray<\/h3><p>SplFixedArray cr&eacute;e un nombre fixe d&rsquo;&eacute;l&eacute;ments dans le tableau et les cl&eacute;s seront des entiers dans l&rsquo;intervalle.<\/p><p>Dans les versions pr&eacute;c&eacute;dentes de PHP, la fonction <code>json_encode <\/code>encodait les instances <code>SplFixedArray <\/code>sous forme d&rsquo;objets au lieu de tableaux. Cela va changer car <code>SplFixedArray <\/code>impl&eacute;mente l&rsquo;interface <strong>JsonSerializable <\/strong>et l&rsquo;encode comme des tableaux.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$array = new SplFixedArray(3);\n$array[] = 'Web hosting';\n$array[] = 'Domain name';\n$array[] = 'SSL certificate';\necho json_encode($array);<\/pre><p>Avant PHP 8.1, la sortie &eacute;tait la suivante :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\"0\":\"Web hosting\",\"1\":\"Domain name\",\"2\":\"SSL certificate\"}\n<\/pre><p>En PHP 8.1, ce sera comme ceci :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[\"Web hosting\",\"Domain name\",\"SSL certificate\"]\n<\/pre><h3 class=\"wp-block-heading\">Ressources pour les migrations d&rsquo;objets<\/h3><p>Le d&eacute;veloppement de PHP pr&eacute;voit de d&eacute;placer les ressources vers des objets de classe standard.<\/p><p>L&rsquo;un des probl&egrave;mes est qu&rsquo;il n&rsquo;est pas possible d&rsquo;utiliser le type de ressource. De plus, l&rsquo;absence d&rsquo;un type de ressource emp&ecirc;che certaines fonctionnalit&eacute;s li&eacute;es aux ressources d&rsquo;ajouter des types plus stricts.<\/p><p>Un autre d&eacute;fi est de maintenir certains types de ressources avec des fonctionnalit&eacute;s comme l&rsquo;&eacute;tat interne, la gestion de la m&eacute;moire et le comptage des r&eacute;f&eacute;rences. Par cons&eacute;quent, dans ce cas, les classes PHP peuvent &ecirc;tre utilis&eacute;es &agrave; la place.<\/p><p>Ce sont quelques-unes des raisons pour lesquelles l&rsquo;&eacute;quipe PHP migre les types de ressources vers les objets. Cependant, les types de ressources ont &eacute;t&eacute; largement utilis&eacute;s dans les applications PHP, l&rsquo;&eacute;quipe doit donc s&rsquo;assurer que la migration ne soit pas perturb&eacute;e.<\/p><p><strong>Les ressources de connexion FTP sont maintenant des objets de classe FTP\\Connection<\/strong><\/p><p>Dans la version pr&eacute;c&eacute;dente de PHP, nous utilisions les fonctions <code>ftp_connect()<\/code> ou <code>ftp_ssl_connect()<\/code> pour cr&eacute;er une connexion FTP. Ces fonctions retournent une ressource de type <code>ftp<\/code>.<\/p><p>En PHP 8.1, ces fonctions retournent une classe <code>FTP\\Connection<\/code>. Cette nouvelle classe est &eacute;galement d&eacute;clar&eacute;e finale, ce qui signifie que vous ne pouvez pas l&rsquo;&eacute;tendre. Cela minimise &eacute;galement les probl&egrave;mes potentiels de compatibilit&eacute; ascendante si le noyau de PHP modifie les m&eacute;thodes de la classe <code>FTP\\Connection<\/code>.<\/p><p><strong>Les identifiants des polices GD sont maintenant des objets de classe GdFont<\/strong><\/p><p>Dans les versions pr&eacute;c&eacute;dentes de PHP, la fonction <code>imageloadfont()<\/code> de l&rsquo;extension GD &eacute;tait utilis&eacute;e pour retourner un <code>font-identifier<\/code> de ressource dans un entier.<\/p><p>Dans la nouvelle version de PHP, l&rsquo;ID de ressource a migr&eacute; vers une classe <code>GdFont<\/code>.<\/p><p>Pour rendre le changement moins perturbant, toutes les fonctions qui acceptent un ID de ressource de <code>imag<\/code> eloadfont() acceptent &eacute;galement le nouvel objet de classe <code>GdFont<\/code>.<\/p><p><strong>Les ressources file_info sont maintenant des objets finfo<\/strong><\/p><p>Certaines des fonctions de l&rsquo;extension <strong>finfo <\/strong>retournent et acceptent des objets ressources de type <code>file_info<\/code>. Ceci est maintenant chang&eacute; en objets de classe <code>finfo<\/code> pour s&rsquo;aligner avec le plan de migration de PHP.<\/p><p>Notez que la classe <code>finfo <\/code>est disponible depuis PHP 5.3. Cependant, les fonctions <code>finfo_*()<\/code> acceptent ou retournent des ressources. Ceci est maintenant corrig&eacute;, et il est m&ecirc;me possible de changer les valeurs de retour en objets.<\/p><p>Ce sont les fonctions concern&eacute;es par les changements :<\/p><ul class=\"wp-block-list\">\n<li><code>finfo_buffer()<\/code><\/li>\n\n\n\n<li><code>finfo_close()<\/code><\/li>\n\n\n\n<li><code>finfo_file()<\/code><\/li>\n\n\n\n<li><code>finfo_open()<\/code><\/li>\n\n\n\n<li><code>finfo_set_flags()<\/code><\/li>\n<\/ul><p><strong>Les ressources imap sont maintenant des objets de classe IMAP\\connection<\/strong><\/p><p>Les ressources de <code>IMAP connexion<\/code> ont &eacute;t&eacute; migr&eacute;es vers la classe <code>IMAP\\Connection<\/code>. Avant cela, la fonction <code>imap_open()<\/code> renvoyait un objet ressource de typeimap.<\/p><p>Pour minimiser l&rsquo;interruption de la migration, toutes les fonctions qui acceptent des ressources fonctionneront avec la nouvelle classe <code>IMAP\\Connection<\/code>.<\/p><p>Comme la classe <code>FTP\\Connection<\/code>, la classe <code>IMAP\\Connection<\/code> est &eacute;galement d&eacute;clar&eacute;e finale pour &eacute;viter qu&rsquo;elle ne soit &eacute;tendue et qu&rsquo;elle ne pose des probl&egrave;mes de r&eacute;trocompatibilit&eacute;.<\/p><p><strong>Les ressources PostgreSQL sont d&eacute;sormais des objets \\PgSql\\Connection, \\PgSql\\Result, et \\PgSql\\Lob<\/strong><\/p><p>PostgreSQL est une extension de base de donn&eacute;es PHP qui utilise des objets ressources pour les connexions aux bases de donn&eacute;es et les r&eacute;sultats. Trois objets ressources pour PostgreSQL ont &eacute;t&eacute; migr&eacute;s en objets classes.<\/p><ul class=\"wp-block-list\">\n<li>ressource de <code>pgsql link<\/code> &agrave; la classe <code>PgSql\\Connection<\/code>.<\/li>\n\n\n\n<li>ressource de <code>pgsql result<\/code> &agrave; la classe <code>PgSql\\Result<\/code>.<\/li>\n\n\n\n<li>Ressource <code>pgsql<\/code> pour les objets de grande taille de la classe <code>PgSql\\Lob<\/code>.<\/li>\n<\/ul><p>Toutes les fonctions PostgreSQL qui retournent et acceptent des objets ressources supportent maintenant les nouveaux objets classes.<\/p><p><strong>Les ressources LDAP sont d&eacute;sormais des objets LDAP\\Connection, LDAP\\Result, et LDAP\\ResultEntry<\/strong><\/p><p>LDAP (Lightweight Directory Access Protocol) est une extension PHP permettant d&rsquo;acc&eacute;der aux serveurs d&rsquo;annuaire, une base de donn&eacute;es sp&eacute;ciale qui stocke les informations dans une structure arborescente.<\/p><p>Cette extension utilisait trois objets ressources avant PHP 8.1. Ces trois objets ont &eacute;t&eacute; migr&eacute;s vers de nouvelles instances de classe.<\/p><ul class=\"wp-block-list\">\n<li>ressource de <code>ldap link<\/code> &agrave; la classe <code>\\LDAP\\Connection<\/code>.<\/li>\n\n\n\n<li>ressource de <code>ldap result<\/code> &agrave; la classe <code>\\LDAP\\Result<\/code>.<\/li>\n\n\n\n<li>ressource de <code>ldap result entry<\/code> &agrave; la classe \\LDAP\\ResultEntry.<\/li>\n<\/ul><p>Toutes les fonctions LDAP qui renvoient ou acceptent des objets ressources acceptent d&eacute;sormais les nouveaux objets classes.<\/p><p><strong>Les ressources Pspell Config sont d&eacute;sormais des objets de classe PSpell\\Dictionary, PSpell\\Config<\/strong><\/p><p>L&rsquo;extension PHP Pspell permet de v&eacute;rifier l&rsquo;orthographe et fournit des suggestions de mots. Elle utilise les types d&rsquo;objets ressources <code>pspell <\/code>et <code>pspell <\/code>config avec un identifiant entier.<\/p><p>Ces objets ressources ont &eacute;t&eacute; remplac&eacute;s par les objets de classe <code>PSpell\\Dictionary<\/code> et <code>PSpell\\Config<\/code> en PHP 8.1. Voici les fonctions permettant de cr&eacute;er les objets <code>PSpell\\Dictionary<\/code> et <code>PSpell\\Config<\/code> :<\/p><ul class=\"wp-block-list\">\n<li><code>pspell_new()<\/code><\/li>\n\n\n\n<li><code>pspell_new_config()<\/code><\/li>\n\n\n\n<li><code>pspell_new_personal()<\/code><\/li>\n\n\n\n<li><code>pspell_config_create()<\/code><\/li>\n<\/ul><p>Comme les autres ressources migr&eacute;es, toutes les fonctions qui acceptent les ressources <code>pspell<\/code> et <code>pspell config <\/code>accepteront &eacute;galement <code>PSpell\\Dictionary<\/code> et <code>PSpell\\Config<\/code>.<\/p><h2 class=\"wp-block-heading\" id=\"h-depreciations-en-php-8-1\">D&eacute;pr&eacute;ciations en PHP 8.1<\/h2><p>PHP 8.1 a d&eacute;pr&eacute;ci&eacute; plusieurs fonctionnalit&eacute;s, dont plus de dix fonctions PHP d&eacute;j&agrave; existantes. Voici le r&eacute;capitulatif des fonctionnalit&eacute;s et des fonctions qui ont &eacute;t&eacute; d&eacute;pr&eacute;ci&eacute;es en PHP 8.1.<\/p><h3 class=\"wp-block-heading\">Restrictions d&rsquo;utilisation de $Globals<\/h3><p>La variable <code>$GLOBALS <\/code>donne des r&eacute;f&eacute;rences &agrave; toutes les variables de port&eacute;e globale. Elle contient &eacute;galement les valeurs &laquo;&nbsp;superglobales&nbsp;&raquo;, notamment <code>$_GET<\/code>, <code>$_SERVER<\/code> et <code>$_ENV<\/code>.<\/p><p>PHP 8.1 ne d&eacute;pr&eacute;cie pas compl&egrave;tement cette fonctionnalit&eacute; mais restreint toute modification du tableau <code>$GLOBALS<\/code>, comme la destruction du tableau, l&rsquo;&eacute;crasement de sa valeur, et la r&eacute;f&eacute;rence &agrave; la variable <code>$GLOBALS<\/code>.<\/p><p>En effet, la prise en charge de certains comportements de variables <code>$GLOBALS <\/code>n&eacute;cessite un travail technique complexe.<\/p><p>Si vous essayez d&rsquo;effectuer ces modifications sous PHP 8.1, vous obtiendrez une erreur fatale. Voici un exemple de modification en masse de la variable<code> $GLOBALS<\/code> :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$GLOBALS = [];\n$GLOBALS = ['foo' =&gt; 1, 'bar' =&gt; 2];\n$GLOBALS = get_new_vars();\n$GLOBALS =&amp; $new_vars;\nlist($GLOBALS) = [1];\nforeach ($new_var_c as $GLOBALS) {}\nunset($GLOBALS);<\/pre><p>Il en r&eacute;sultera l&rsquo;erreur suivante :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in ... on line &hellip;<\/pre><p>Notez que l&rsquo;utilisation en lecture seule de la variable <code>$GLOBALS<\/code> et la modification des &eacute;l&eacute;ments individuels du tableau sont toujours autoris&eacute;es.<\/p><h3 class=\"wp-block-heading\">Le passage de null &agrave; une fonction interne non-nullable n&rsquo;est pas autoris&eacute;.<\/h3><p>En PHP, vous ne devriez pas pouvoir passer des valeurs nulles &agrave; des fonctions non nulles. Cette restriction fonctionnait pour les fonctions d&eacute;finies par l&rsquo;utilisateur dans les versions pr&eacute;c&eacute;dentes de PHP. Les fonctions internes acceptaient les valeurs nulles en silence.<\/p><p>Pour maintenir la coh&eacute;rence, les fonctions internes n&rsquo;acceptent plus les valeurs nulles. Passer null &agrave; des arguments non-nullables retournera un avis de d&eacute;pr&eacute;ciation.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var_dump(str_contains(\"foobar\", null));\nDeprecated: Passing null to argument of type string is deprecated<\/pre><p>Cette d&eacute;pr&eacute;ciation fait partie d&rsquo;un plan visant &agrave; supprimer la fonctionnalit&eacute;. Selon sa <strong><a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_null_to_scalar_internal_arg\" target=\"_blank\" rel=\"noopener\">RFC<\/a><\/strong>, le passage de valeurs nulles &agrave; des fonctions internes non nulles entra&icirc;nera une TypeError. Cela rendra les fonctions internes coh&eacute;rentes avec le comportement actuel des fonctions d&eacute;finies par l&rsquo;utilisateur.<\/p><h3 class=\"wp-block-heading\">Fonctions d&eacute;pr&eacute;ci&eacute;es<\/h3><p>PHP 8.1 d&eacute;pr&eacute;cie &eacute;galement 11 fonctions PHP qui peuvent affecter les applications existantes.<\/p><p><strong>Interface s&eacute;rialisable d&eacute;pr&eacute;ci&eacute;e<\/strong><\/p><p>Les classes PHP ont leur propre logique de s&eacute;rialisation. Par exemple, elles peuvent emp&ecirc;cher la s&eacute;rialisation de certaines donn&eacute;es sensibles ou r&eacute;tablir des connexions &agrave; un serveur distant en utilisant du texte s&eacute;rialis&eacute;. Elles utilisent trois m&eacute;thodes diff&eacute;rentes :<\/p><ul class=\"wp-block-list\">\n<li>Les m&eacute;thodes magiques <code>__sleep<\/code> et <code>__wakeup<\/code>.<\/li>\n\n\n\n<li>Interface <code>Serializable<\/code>, m&eacute;thodes <code>Serializable::serialize<\/code> et <code>Serializable:unserialize<\/code>.<\/li>\n\n\n\n<li>Les m&eacute;thodes magiques <code>__serialize<\/code> et <code>__unserialize<\/code>.<\/li>\n<\/ul><p><code>__serialize<\/code> et <code>__unserialize<\/code> ont &eacute;t&eacute; introduites en PHP 7.4 pour r&eacute;soudre le probl&egrave;me de l&rsquo;interface Serializable. Cependant, le plan final est de supprimer l&rsquo;interface Serializable dans les futures versions de PHP.<\/p><p>En PHP 8.1, l&rsquo;impl&eacute;mentation de l&rsquo;interface <code>Serialize <\/code>sur une classe sans les m&eacute;thodes <code>__serialize<\/code> et <code>__unserialize<\/code> entra&icirc;nera une erreur de d&eacute;pr&eacute;ciation.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Test implements Serializable{\n    public function serialize() {}\n    public function unserialize($data) {}\n}<\/pre><p>Il en r&eacute;sultera le message d&rsquo;erreur suivant :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Deprecated: Test implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line &hellip;<\/pre><p>Cependant, il est toujours possible d&rsquo;impl&eacute;menter une interface Serializable tant que la classe impl&eacute;mente &eacute;galement les m&eacute;thodes magiques <code>__serialize<\/code> et <code>__unserialize<\/code>.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Test implements Serializable{\n    public function __serialize(): array {}\n    public function __unserialize(array $data): void {}\n    public function serialize(): array {}\n    public function unserialize(string $data): void {}<\/pre><p>L&rsquo;interface <code>Serializable <\/code>d&eacute;code la charge utile de s&eacute;rialisation existante, et la notice de d&eacute;pr&eacute;ciation n&rsquo;appara&icirc;tra pas. Si l&rsquo;application ne n&eacute;cessite pas le support de PHP 7.3, vous pouvez remplacer l&rsquo;interface Serializable par les m&eacute;thodes magiques <code>__serialize<\/code> et <code>__unserialize<\/code>.<\/p><p><strong>Autovivification d&eacute;pr&eacute;ci&eacute;e sur False<\/strong><\/p><p>L&rsquo;autovivification est l&rsquo;auto-cr&eacute;ation de tableaux &agrave; partir de valeurs fausses et nulles. Bien que cette fonctionnalit&eacute; soit largement utilis&eacute;e dans les applications PHP, la cr&eacute;ation automatique d&rsquo;un tableau &agrave; partir de valeurs fausses n&rsquo;est pas id&eacute;ale car elle peut &ecirc;tre le signe d&rsquo;un code bogu&eacute;.<\/p><p>Ainsi, PHP 8.1 d&eacute;pr&eacute;cie l&rsquo;autovivification uniquement pour les valeurs fausses. Impl&eacute;menter l&rsquo;autovivification sur une fausse variable en PHP 8.1 r&eacute;sultera en un avis de d&eacute;pr&eacute;ciation.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$arr = false;\n$arr[] = 2;\nDeprecated: Automatic conversion of false to array is deprecated in<\/pre><p>Dans les prochaines versions, le plan est d&rsquo;&eacute;mettre une erreur fatale sur une telle mise en &oelig;uvre. Comme pour les valeurs ind&eacute;finies et nulles, l&rsquo;autoviviation est toujours autoris&eacute;e.<\/p><p><strong>D&eacute;pr&eacute;ci&eacute; mysqli::get_client_info et mysqli_get_client_info ($param)<\/strong><\/p><p>Le passage de param&egrave;tres &agrave; la fonction <code>mysqli_get_client_info()<\/code> et la m&eacute;thode <code>mysqli::get_client_info<\/code> sont utilis&eacute;s pour renvoyer la version du client MySQLi par le biais de la constante cha&icirc;ne <code>client_info<\/code>.<\/p><p>Avant PHP 8.1, il y a quatre options possibles pour exposer la constante client_info :<\/p><ul class=\"wp-block-list\">\n<li><code>mysqli_driver properties<\/code><\/li>\n\n\n\n<li><code>mysqli properties<\/code><\/li>\n\n\n\n<li><code>mysqli_get_client_info() function<\/code><\/li>\n\n\n\n<li><code>mysqli::get_client_info method<\/code><\/li>\n<\/ul><p>D&rsquo;autre part, MySQL Native Driver (MySQLnd) expose la constante avec seulement deux options &ndash; une constante et un appel de fonction.<\/p><p>Le passage de param&egrave;tres &agrave; la fonction <code>mysqli_get_client_info()<\/code> et <code>mysqli::get_client_info<\/code> est maintenant d&eacute;pr&eacute;ci&eacute; dans un effort d&rsquo;unifier la m&eacute;thode d&rsquo;acc&egrave;s.<\/p><p>L&rsquo;utilisation de la m&eacute;thode <code>get_client_info<\/code> dans la classe <code>mysqli<\/code> &eacute;met d&eacute;sormais un avis de d&eacute;pr&eacute;ciation.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$info = $connection-&gt;get_client_info();\nDeprecated: Method mysqli::get_client_info() is deprecated in &hellip;<\/pre><p>Le passage de param&egrave;tres &agrave; la fonction <code>mysqli_get_client_info()<\/code> entra&icirc;nera &eacute;galement une notification de d&eacute;pr&eacute;ciation :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$info = mysqli_get_client_info($connection);\nDeprecated: mysqli_get_client_info(): Passing connection object as an argument is deprecated in &hellip;<\/pre><p>Plut&ocirc;t que d&rsquo;utiliser les options obsol&egrave;tes, utilisez la fonction <code>mysqli_get_client_info()<\/code> sans param&egrave;tres.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$info = mysqli_get_client_info();<\/pre><p><strong>D&eacute;pr&eacute;ci&eacute; Conversion Implicite Incompatible de Float en Int<\/strong><\/p><p>La coercition de type est courante en PHP, et dans la plupart des cas, elle est utile. Cependant, le probl&egrave;me se pose lorsqu&rsquo;un nombre flottant est converti en un nombre entier, car cela peut entra&icirc;ner une perte de donn&eacute;es. Par exemple, 1,618 sera converti en 1, perdant ainsi sa valeur fractionnaire.<\/p><p>PHP 8.1 r&eacute;sout ce probl&egrave;me en &eacute;mettant un avis de d&eacute;pr&eacute;ciation si un flottant non compatible est implicitement converti en entier. Cette notification devrait emp&ecirc;cher la perte involontaire de valeurs fractionnaires.<\/p><p>Voici un exemple de d&eacute;claration d&rsquo;une fonction avec un type de retour int. Lorsque la fonction est appel&eacute;e, PHP convertira la valeur de 1.618 en un entier, g&eacute;n&eacute;rant un avis de d&eacute;pr&eacute;ciation :<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function get_integer(): int {\nReturn &lsquo;1.618&rsquo;:\n}\nget_integer();\nPHP Deprecated:  Implicit conversion from float-string \"6.8\" to int loses precision in ... on line ...<\/pre><p>La notification de d&eacute;pr&eacute;ciation ne sera pas &eacute;mise si la valeur est un flottant compatible avec les nombres entiers. Selon la RFC, <strong><a href=\"https:\/\/wiki.php.net\/rfc\/implicit-float-int-deprecate\" target=\"_blank\" rel=\"noopener\">voici les caract&eacute;ristiques<\/a><\/strong> d&rsquo;un flottant compatible avec les nombres entiers :<\/p><ul class=\"wp-block-list\">\n<li>C&rsquo;est un num&eacute;ro.<\/li>\n\n\n\n<li>Il est dans l&rsquo;intervalle d&rsquo;un entier de PHP.<\/li>\n\n\n\n<li>Il n&rsquo;a pas de partie fractionnaire.<\/li>\n<\/ul><p><strong>Param&egrave;tres INI de filter.default et filter.default_options d&eacute;pr&eacute;ci&eacute;s<\/strong><\/p><p>Le param&egrave;tre INI <code>filter.default<\/code> applique un filtre &agrave; tous les super globaux de PHP en fonction de sa valeur. La valeur par d&eacute;faut de ce param&egrave;tre est <code>filter.default=unsafe_raw<\/code> &ndash; il &eacute;vite toute application de filtre sur les super globaux.<\/p><p>Le probl&egrave;me avec ce param&egrave;tre est qu&rsquo;il peut ramener la fonctionnalit&eacute; des guillemets magiques avec la valeur <code>filter.default=magic_quotes<\/code>. Cette fonctionnalit&eacute; a &eacute;t&eacute; supprim&eacute;e en PHP 5.4 en raison d&rsquo;une approche peu fiable de l&rsquo;assainissement des entr&eacute;es utilisateur.<\/p><p>Pour pallier ce probl&egrave;me, l&rsquo;attribution d&rsquo;une valeur autre que <code>unsafe_raw<\/code> au param&egrave;tre <code>filter.default<\/code> INI &eacute;mettra un avis de d&eacute;pr&eacute;ciation PHP au moment du d&eacute;marrage. Il n&rsquo;y a pas d&rsquo;avertissement s&eacute;par&eacute; pour <code>filter.default_options<\/code>, mais ces deux param&egrave;tres INI seront supprim&eacute;s dans la prochaine version majeure de PHP.<\/p><p><strong>D&eacute;pr&eacute;ci&eacute; date_sunrise et date_sunset<\/strong><\/p><p>Les fonctions <code>date_sunrise()<\/code> et <code>date_sunset()<\/code> renvoient les heures de lever et de coucher du soleil en prenant les valeurs par d&eacute;faut <code>date.default_latitude<\/code> et <code>date.default_longitude<\/code> des param&egrave;tres INI de PHP. Malheureusement, aucune autre fonction n&rsquo;utilise ces param&egrave;tres INI, et le concept lui-m&ecirc;me n&rsquo;a pas beaucoup de sens.<\/p><p>Par cons&eacute;quent, les fonctions <code>date_sunrise()<\/code> et <code>date_sunset()<\/code> sont d&eacute;pr&eacute;ci&eacute;es dans PHP 8.1 et remplac&eacute;es par la fonction <code>date_sun_info()<\/code>. En accord avec cette d&eacute;pr&eacute;ciation, les param&egrave;tres INI suivants sont &eacute;galement d&eacute;pr&eacute;ci&eacute;s :<\/p><ul class=\"wp-block-list\">\n<li><code>date.default_latitude<\/code><\/li>\n\n\n\n<li><code>date.default_longitude<\/code><\/li>\n\n\n\n<li><code>date.sunrise_zenith<\/code><\/li>\n\n\n\n<li><code>date.sunset_senith<\/code><\/li>\n<\/ul><p>L&rsquo;utilisation des fonctions <code>date_sunrise<\/code> et <code>date_sunset<\/code> en PHP 8.1 &eacute;mettra un avertissement de d&eacute;pr&eacute;ciation. Cependant, la d&eacute;finition des valeurs INI correspondantes ou l&rsquo;utilisation de la fonction <code>ini_set<\/code> ne g&eacute;n&egrave;rera pas l&rsquo;avertissement.<\/p><p><strong>D&eacute;pr&eacute;ci&eacute; strptime<\/strong><\/p><p>La fonction <code>strptime()<\/code> analyse les cha&icirc;nes de date ou d&rsquo;heure dans des tableaux. L&rsquo;utilisation de cette fonction sur certaines distributions Linux comme Alpine peut entra&icirc;ner un comportement inattendu car elle utilise la biblioth&egrave;que C musl. De plus, cette fonction est locale et peut &ecirc;tre affect&eacute;e si vous ex&eacute;cutez un autre code dans un autre thread.<\/p><p>Le manuel de la fonction recommande l&rsquo;utilisation de <code>date_parse_from_format()<\/code> car elle est plus coh&eacute;rente et ne souffre pas des m&ecirc;mes probl&egrave;mes. D&rsquo;autres alternatives sont &eacute;galement disponibles, comme <code>DateTime::createFromFormat()<\/code>, plus orient&eacute;e objet, et <code>IntlDateFormatter::parse()<\/code> pour une analyse d&eacute;pendante des param&egrave;tres locaux.<\/p><p>En cons&eacute;quence, la fonction <code>strptime()<\/code> est d&eacute;pr&eacute;ci&eacute;e au profit d&rsquo;options plus coh&eacute;rentes.<\/p><p><strong>D&eacute;pr&eacute;ciations de strftime et gmstrftime<\/strong><\/p><p>Les fonctions <code>strftime()<\/code> et <code>gmstrftime()<\/code> sont similaires &agrave; <code>strptime()<\/code>. Elles formatent un horodatage en fonction des param&egrave;tres r&eacute;gionaux, sauf que <code>gmstrftime<\/code> renvoie l&rsquo;heure en GMT.<\/p><p>Malheureusement, ces fonctions souffrent des m&ecirc;mes probl&egrave;mes que <code>strptime()<\/code> en termes de formats pris en charge et de comportements.<\/p><p>Ces fonctions sont d&eacute;pr&eacute;ci&eacute;es et remplac&eacute;es par la fonction <code>date()<\/code> ou <code>DateTime::format()<\/code>. Pour une utilisation d&eacute;pendant de la localisation, <code>IntlDateFormatter::format<\/code> est le remplacement id&eacute;al.<\/p><p><strong>Deprecated mhash*() or hash extensions<\/strong><\/p><p>Les fonctions <code>mhash*()<\/code> ont &eacute;t&eacute; apport&eacute;es &agrave; PHP par l&rsquo;extension <strong>mhash<\/strong>. Cependant, cette extension a &eacute;t&eacute; remplac&eacute;e par l&rsquo;extension hash en PHP 5.3. Il n&rsquo;est possible d&rsquo;utiliser ces fonctions qu&rsquo;avec une extension hash et l&rsquo;option de configuration PHP <code>--enable-mhash<\/code>.<\/p><p>Depuis PHP 7.4, l&rsquo;extension hash est devenue un paquet avec PHP. Les fonctions <code>mhash*()<\/code>sont toujours utilisables car l&rsquo;option <code>--enable-mhash<\/code> est toujours support&eacute;e pour des raisons de compatibilit&eacute;.<\/p><p>Toutefois, l&rsquo;&eacute;quipe PHP a d&eacute;pr&eacute;ci&eacute; <code>mhash*() functions<\/code><em> en PHP 8.1 et les supprimera en PHP 9.0. L&rsquo;utilisation <code>mhash*() functions<\/code><\/em> suivantes retournera un avertissement de d&eacute;pr&eacute;ciation :<\/p><ul class=\"wp-block-list\">\n<li><code>mhash<\/code><\/li>\n\n\n\n<li><code>mhash_count<\/code><\/li>\n\n\n\n<li><code>mhash_get_block_size<\/code><\/li>\n\n\n\n<li><code>mhash_get_hash_name<\/code><\/li>\n\n\n\n<li><code>mhash_keygen_s2k<\/code><\/li>\n<\/ul><p>Puisque le hachage est maintenant l&rsquo;extension par d&eacute;faut, nous recommandons d&rsquo;utiliser les fonctions <code>hash*()<\/code> &agrave; la place.<\/p><p><strong>D&eacute;pr&eacute;ci&eacute; PDO::FETCH_SERIALIZE<\/strong><\/p><p><code>PDO::FETCH_SERIALIZE<\/code>&nbsp;est utilis&eacute; comme un drapeau pour les m&eacute;thodes de r&eacute;cup&eacute;ration des d&eacute;clarations PDO. Ensuite, PDO est cens&eacute; appeler unserialize sur les donn&eacute;es extraites de la base de donn&eacute;es.<\/p><p>Cette fonctionnalit&eacute; est cependant inutilisable. De plus, avec la d&eacute;pr&eacute;ciation de l&rsquo;interface <code>Serializable<\/code>, l&rsquo;&eacute;quipe PHP a &eacute;galement d&eacute;cid&eacute; de d&eacute;pr&eacute;cier <code>PDO::FETCH_SERIALIZE<\/code>.<\/p><p>L&rsquo;utilisation de <code>PDO::FETCH_SERIALIZE<\/code> en PHP 8.1 retournera un avis de d&eacute;pr&eacute;ciation.<\/p><p><strong>D&eacute;pr&eacute;ci&eacute; MySQLi : propri&eacute;t&eacute; mysqli_driver-&gt;driver_version<\/strong><\/p><p>La propri&eacute;t&eacute; <code>mysqli_driver-&gt;driver_version<\/code> dans l&rsquo;extension <strong>MySQLi <\/strong>est cens&eacute;e retourner la valeur de la version du pilote. Cependant, cette propri&eacute;t&eacute; n&rsquo;a pas &eacute;t&eacute; mise &agrave; jour depuis 13 ans malgr&eacute; les nombreuses modifications apport&eacute;es au pilote.<\/p><p>Par cons&eacute;quent, cette propri&eacute;t&eacute; a &eacute;t&eacute; rendue inutile et d&eacute;pr&eacute;ci&eacute;e en PHP 8.1.<\/p><figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.hostinger.com\/fr\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/FR-Web-hosting_in-text-banner-1-1024x300-1.png\/public\" alt=\"\" class=\"wp-image-41467\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/FR-Web-hosting_in-text-banner-1-1024x300-1.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/FR-Web-hosting_in-text-banner-1-1024x300-1.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/FR-Web-hosting_in-text-banner-1-1024x300-1.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/46\/2022\/12\/FR-Web-hosting_in-text-banner-1-1024x300-1.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2><p>En tant que nouvelle version majeure, PHP 8.1 apporte beaucoup de nouvelles fonctionnalit&eacute;s, de changements et de d&eacute;pr&eacute;ciations qui sont de bonnes nouvelles pour les d&eacute;veloppeurs PHP.<\/p><p>Par exemple, les fonctionnalit&eacute;s comme les fibres devraient ouvrir de nouvelles possibilit&eacute;s d&rsquo;&ecirc;tre cr&eacute;atif dans l&rsquo;ex&eacute;cution du codage. M&ecirc;me les petits changements comme la conversion des guillemets simples en entit&eacute;s HTML sont les bienvenus.<\/p><p>Vous pouvez consulter la documentation officielle de PHP pour voir <strong><a href=\"https:\/\/wiki.php.net\/rfc#php_81\" target=\"_blank\" rel=\"noopener\">la liste compl&egrave;te des RFC<\/a><\/strong> ou <strong><a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1\" target=\"_blank\" rel=\"noopener\">la liste des d&eacute;pr&eacute;ciations<\/a><\/strong> pour plus d&rsquo;informations sur PHP 8.1.<\/p><p>Hostinger prendra en charge PHP 8.1, mais nous conserverons les options pour les anciennes versions de PHP au cas o&ugrave; vous en auriez besoin. Cependant, nous vous recommandons vivement de passer &agrave; PHP 8.1 pour acc&eacute;der aux nouvelles am&eacute;liorations et maintenir la compatibilit&eacute; avec les frameworks et les biblioth&egrave;ques.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La version PHP 8.1 est la nouvelle version de PHP publi&eacute;e en novembre 2021. Cette version s&rsquo;accompagne de nouvelles fonctionnalit&eacute;s, d&rsquo;am&eacute;liorations des performances et de changements qui ouvriront davantage de possibilit&eacute;s aux d&eacute;veloppeurs PHP pour travailler de mani&egrave;re efficace et plus cr&eacute;ative. Il existe plus de 20 nouvelles fonctionnalit&eacute;s, des tonnes de changements, et plusieurs [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/fr\/tutoriels\/php-8-1\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":261,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"PHP 8.1 : Nouvelles fonctions et d\u00e9pr\u00e9ciations","rank_math_description":"Dans cet article, nous allons d\u00e9tailler les diff\u00e9rentes derri\u00e8res fonctions de PHP 8.1. N'h\u00e9sitez pas \u00e0 suivre ce tuto.","rank_math_focus_keyword":"PHP 8.1","footnotes":""},"categories":[4809],"tags":[5782,5781,5780],"class_list":["post-9789","post","type-post","status-publish","format-standard","hentry","category-php","tag-ameliorations-php-8-1","tag-derniere-version-php-8-1","tag-php-8-1"],"hreflangs":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/posts\/9789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/users\/261"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/comments?post=9789"}],"version-history":[{"count":18,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/posts\/9789\/revisions"}],"predecessor-version":[{"id":35157,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/posts\/9789\/revisions\/35157"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/media?parent=9789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/categories?post=9789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/fr\/tutoriels\/wp-json\/wp\/v2\/tags?post=9789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}