{"id":39112,"date":"2020-05-27T02:26:40","date_gmt":"2020-05-27T09:26:40","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-09-15T14:26:16","modified_gmt":"2023-09-15T13:26:16","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/php-8\/","title":{"rendered":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)"},"content":{"rendered":"<p>PHP 8 a \u00e9t\u00e9 officiellement mis \u00e0 la disposition du public le 26 novembre 2020 !<\/p>\n<p>Cette nouvelle mise \u00e0 jour majeure apporte tout un tas d&rsquo;optimisations et de puissantes fonctionnalit\u00e9s au langage et nous sommes heureux de vous pr\u00e9senter les changements les plus int\u00e9ressants qui nous permettront d&rsquo;\u00e9crire un meilleur code et de construire des applications plus puissantes.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84636\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8 released\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">Addendum \u00e0 l&rsquo;annonce du PHP 8.0<\/a><\/figcaption><\/figure>\n<p>\u00cates-vous pr\u00eat ? Plongeons dans le vif du sujet !<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (Compilation Just in Time)<\/h2>\n<p>La fonctionnalit\u00e9 la plus acclam\u00e9e de PHP 8 est la <strong>compilation \u00e0 la vol\u00e9e (Just In Time)<\/strong>. Qu&rsquo;est-ce que JIT ?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">La proposition de RFC<\/a> d\u00e9crit JIT comme suit :<\/p>\n<blockquote><p>\u00ab PHP JIT est mis en \u0153uvre comme une partie presque ind\u00e9pendante d&rsquo;OPcache. Il peut \u00eatre activ\u00e9 \/ d\u00e9sactiv\u00e9 au moment de la compilation et de l&rsquo;ex\u00e9cution de PHP. Lorsqu&rsquo;il est activ\u00e9, le code natif des fichiers PHP est stock\u00e9 dans une r\u00e9gion suppl\u00e9mentaire de la m\u00e9moire partag\u00e9e d&rsquo;OPcache et op_array\u2192opcodes[].handler(s) conserve les pointeurs vers les points d&rsquo;entr\u00e9e du code JIT-ed \u00bb.<\/p><\/blockquote>\n<p>Alors, comment en sommes-nous arriv\u00e9s \u00e0 JIT et quelle est la diff\u00e9rence entre JIT et OPcache ?<\/p>\n<p>Pour mieux comprendre ce qu&rsquo;est JIT pour PHP, examinons rapidement comment <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-php\/\">PHP<\/a> s\u2019ex\u00e9cute du code source au r\u00e9sultat final.<\/p>\n<p>L&rsquo;ex\u00e9cution de PHP est un processus en 4 \u00e9tapes :<\/p>\n<ul>\n<li><strong>Lexing\/Tokenizing<\/strong> : Tout d&rsquo;abord, l&rsquo;interpr\u00e8teur lit le code PHP et construit un ensemble de jetons.<\/li>\n<li><strong>Parsing<\/strong> : L&rsquo;interpr\u00e8teur v\u00e9rifie si le script correspond aux r\u00e8gles syntaxiques et utilise des jetons pour construire un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">arbre syntaxique abstrait <\/a>(Abstract Syntax Tree ou AST), qui est <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">une repr\u00e9sentation hi\u00e9rarchique de la structure du code source<\/a>.<\/li>\n<li><strong>Compilation<\/strong> : L&rsquo;interpr\u00e8teur parcourt l&rsquo;arbre et traduit les n\u0153uds AST en opcodes Zend de bas niveau, qui sont des identificateurs num\u00e9riques d\u00e9terminant le type d&rsquo;<a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">instruction ex\u00e9cut\u00e9 par la VM Zend<\/a>.<\/li>\n<li><strong>Interpr\u00e9tation<\/strong> : Les opcodes sont interpr\u00e9t\u00e9s et ex\u00e9cut\u00e9s sur la VM Zend.<\/li>\n<\/ul>\n<p>L&rsquo;image suivante montre une repr\u00e9sentation visuelle du processus d&rsquo;ex\u00e9cution de base de PHP.<\/p>\n<figure id=\"attachment_73105\" aria-describedby=\"caption-attachment-73105\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73105 size-full\" src=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/processus-execution-base-php.png\" alt=\"Processus d'ex\u00e9cution de base de PHP\" width=\"1100\" height=\"1460\"><figcaption id=\"caption-attachment-73105\" class=\"wp-caption-text\">Processus d&rsquo;ex\u00e9cution de base de PHP<\/figcaption><\/figure>\n<p>Alors, comment OPcache rend-il PHP plus rapide ? Et quels sont les changements dans le processus d&rsquo;ex\u00e9cution avec JIT ?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>L&rsquo;extension OPcache<\/h3>\n<p>PHP est un langage interpr\u00e9t\u00e9. Cela signifie que lorsqu&rsquo;un script PHP est ex\u00e9cut\u00e9, l&rsquo;interpr\u00e8teur analyse, compile et ex\u00e9cute le code \u00e0 chaque requ\u00eate. Cela peut entra\u00eener une <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">perte de ressources CPU<\/a> et du temps suppl\u00e9mentaire.<\/p>\n<p>C&rsquo;est l\u00e0 que l&rsquo;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">extension OPcache<\/a> entre en jeu :<\/p>\n<blockquote><p>\u00ab\u00a0OPcache am\u00e9liore les performances de PHP en stockant le bytecode des scripts pr\u00e9-compil\u00e9s dans la m\u00e9moire partag\u00e9e, ce qui \u00e9vite \u00e0 PHP de charger et d&rsquo;analyser les scripts \u00e0 chaque requ\u00eate.\u00a0\u00bb<\/p><\/blockquote>\n<p>Lorsque OPcache est activ\u00e9, l&rsquo;interpr\u00e9teur PHP passe par les quatre \u00e9tapes mentionn\u00e9es ci-dessus uniquement la premi\u00e8re fois que le script est ex\u00e9cut\u00e9. Comme les bytecodes PHP sont stock\u00e9s dans la m\u00e9moire partag\u00e9e, ils sont imm\u00e9diatement disponibles en tant que repr\u00e9sentation interm\u00e9diaire de bas niveau et peuvent \u00eatre ex\u00e9cut\u00e9s imm\u00e9diatement sur la VM Zend.<\/p>\n<figure id=\"attachment_73080\" aria-describedby=\"caption-attachment-73080\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73080 size-full\" src=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/processus-execution-php-opcache-active.png\" alt=\"Processus d'ex\u00e9cution PHP avec OPcache activ\u00e9\" width=\"1100\" height=\"1560\"><figcaption id=\"caption-attachment-73080\" class=\"wp-caption-text\">Processus d&rsquo;ex\u00e9cution PHP avec OPcache activ\u00e9<\/figcaption><\/figure>\n<p>\u00c0 partir de PHP 5.5, l&rsquo;extension Zend OPcache est disponible par d\u00e9faut et vous pouvez v\u00e9rifier si vous l&rsquo;avez correctement configur\u00e9e en <a href=\"https:\/\/kinsta.com\/fr\/blog\/phpinfo\/\">appelant simplement <code>phpinfo()<\/code><\/a> depuis un script sur votre serveur ou en consultant votre fichier php.ini (voir les\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">r\u00e9glages de configuration d&rsquo;OPcache<\/a>).<\/p>\n<p>Lecture sugg\u00e9r\u00e9e : <a href=\"https:\/\/kinsta.com\/fr\/blog\/limite-memoire-php\/\">Comment am\u00e9liorer la limite de m\u00e9moire PHP dans WordPress<\/a>.<\/p>\n<figure id=\"attachment_73106\" aria-describedby=\"caption-attachment-73106\" style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73106 size-full\" src=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/section-zend-opcache-page-phpinfo.jpg\" alt=\"Section Zend OPcache dans une page phpinfo\" width=\"1926\" height=\"992\"><figcaption id=\"caption-attachment-73106\" class=\"wp-caption-text\">Section Zend OPcache dans une page phpinfo<\/figcaption><\/figure>\n<h3>Pr\u00e9chargement<\/h3>\n<p>OPcache a \u00e9t\u00e9 r\u00e9cemment am\u00e9lior\u00e9 avec la mise en \u0153uvre du <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">pr\u00e9chargement<\/a>, une nouvelle fonctionnalit\u00e9 d&rsquo;OPcache ajout\u00e9e avec <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/\">PHP 7.4<\/a>. Le pr\u00e9chargement permet de stocker un ensemble sp\u00e9cifique de scripts dans la m\u00e9moire d&rsquo;OPcache \u00ab\u00a0<i>avant l&rsquo;ex\u00e9cution de tout code d&rsquo;application\u00a0\u00bb<\/i>, mais il n&rsquo;apporte pas d&rsquo;am\u00e9lioration tangible des performances des applications web typiques.<\/p>\n<p>Vous pouvez en savoir plus sur le pr\u00e9chargement dans <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#preloading\">notre introduction \u00e0 PHP 7.4<\/a>.<\/p>\n<p>Avec JIT, PHP fait un pas en avant.<\/p>\n<h3>JIT &#8211; La compilation \u00e0 la vol\u00e9e<\/h3>\n<p>M\u00eame si les opcodes se pr\u00e9sentent sous la forme d&rsquo;une repr\u00e9sentation interm\u00e9diaire de bas niveau, ils doivent encore \u00eatre compil\u00e9s en code machine. JIT \u00ab\u00a0n&rsquo;introduit pas de forme IR (Intermediate Representation) suppl\u00e9mentaire\u00a0\u00bb, mais utilise <a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Assembleur dynamique pour les moteurs de g\u00e9n\u00e9ration de code) pour g\u00e9n\u00e9rer du code natif directement \u00e0 partir du byte-code PHP.<\/p>\n<p>En bref, <strong>JIT traduit les parties chaudes du code interm\u00e9diaire en code machine<\/strong>. En contournant la compilation, il serait en mesure d&rsquo;apporter des am\u00e9liorations consid\u00e9rables en termes de performances et d&rsquo;utilisation de la m\u00e9moire.<\/p>\n<p>Zeev Surasky, co-auteur de la proposition de PHP JIT, montre \u00e0 quel point les calculs seraient plus rapides avec JIT :<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Mais, JIT am\u00e9liorerait-il efficacement les <a href=\"https:\/\/kinsta.com\/fr\/blog\/performance-wordpress\/\">performances de WordPress<\/a> ?<\/p>\n<h3>JIT pour les applications web en direct<\/h3>\n<p>Selon la RFC de JIT, la mise en \u0153uvre du compilateur \u00ab just in time \u00bb devrait am\u00e9liorer les performances de PHP. Mais conna\u00eetrions-nous vraiment de telles am\u00e9liorations dans des applications de la vie r\u00e9elle comme WordPress ?<\/p>\n<p>Les premiers tests montrent que JIT permettrait de faire fonctionner beaucoup plus rapidement les charges de travail gourmandes en CPU, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">mais la RFC met en garde<\/a> :<\/p>\n<blockquote><p>\u00ab\u00a0&#8230; comme les tentatives pr\u00e9c\u00e9dentes &#8211; cela ne semble pas actuellement am\u00e9liorer de mani\u00e8re significative les applications de la vie r\u00e9elle comme WordPress (avec opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Il est pr\u00e9vu de fournir un effort suppl\u00e9mentaire, en am\u00e9liorant JIT pour les applications de la vie r\u00e9elle, en utilisant le profilage et les optimisations sp\u00e9culatives\u00a0\u00bb.<\/p><\/blockquote>\n<p>Avec JIT activ\u00e9, le code ne serait pas ex\u00e9cut\u00e9 par la VM Zend, mais par l&rsquo;unit\u00e9 centrale elle-m\u00eame, ce qui am\u00e9liorerait la vitesse de calcul. Les applications web comme <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-wordpress\/\">WordPress<\/a> reposent \u00e9galement sur d&rsquo;autres facteurs comme le <a href=\"https:\/\/kinsta.com\/fr\/blog\/ttfb\/\">TTFB<\/a>, l&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/blog\/reparer-base-de-donnees-wordpress\/\">optimisation des bases de donn\u00e9es, les<\/a><a href=\"https:\/\/kinsta.com\/fr\/apprendre\/http2\/\"> requ\u00eates HTTP<\/a>, etc.<\/p>\n<figure id=\"attachment_84635\" aria-describedby=\"caption-attachment-84635\" style=\"width: 1884px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84635\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-performance-diagram.png\" alt=\"PHP 8 performance diagram\" width=\"1884\" height=\"1206\"><figcaption id=\"caption-attachment-84635\" class=\"wp-caption-text\">Contribution relative de l&rsquo;ECE aux performances du PHP 8 (Source de l&rsquo;image <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">Addendum \u00e0 l&rsquo;annonce du PHP 8.0<\/a>)<\/figcaption><\/figure>\n<p>Ainsi, en ce qui concerne WordPress et les applications similaires, il ne faut pas s&rsquo;attendre \u00e0 une grande augmentation de la vitesse d&rsquo;ex\u00e9cution de PHP. N\u00e9anmoins, JIT pourrait apporter plusieurs avantages aux <a href=\"https:\/\/kinsta.com\/fr\/blog\/salaire-developpeur-web\/\">d\u00e9veloppeurs<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">Selon Nikita Popov<\/a> :<\/p>\n<blockquote><p>\u00ab\u00a0Les avantages du compilateur JIT sont en gros (et comme d\u00e9j\u00e0 soulign\u00e9 dans le RFC) :<\/p>\n<ul>\n<li>Des performances nettement meilleures pour le code num\u00e9rique.<\/li>\n<li>L\u00e9g\u00e8rement plus performant pour le code PHP d&rsquo;application web \u00ab\u00a0typique\u00a0\u00bb.<\/li>\n<li>La possibilit\u00e9 de faire passer davantage de code de C \u00e0 PHP, car PHP sera d\u00e9sormais suffisamment rapide\u00a0\u00bb.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Ainsi, alors que JIT n&rsquo;apportera gu\u00e8re d&rsquo;am\u00e9liorations consid\u00e9rables aux performances de WordPress, il fera passer PHP au niveau sup\u00e9rieur, en en faisant un langage dans lequel de nombreuses fonctions pourraient d\u00e9sormais \u00eatre \u00e9crites directement.<\/p>\n<p>L&rsquo;inconv\u00e9nient, cependant, serait la plus grande complexit\u00e9 qui peut entra\u00eener une augmentation des co\u00fbts de <a href=\"https:\/\/kinsta.com\/fr\/blog\/maintenance-wordpress\/\">maintenance<\/a>, de stabilit\u00e9 et de <a href=\"https:\/\/kinsta.com\/fr\/blog\/debogage-wordpress\/\">d\u00e9bogage<\/a>. Selon Dmitry Stogov :<\/p>\n<blockquote><p>\u00ab JIT est extr\u00eamement simple, mais de toute fa\u00e7on il augmente le niveau de complexit\u00e9 du PHP, le risque de nouveaux types de bugs et le co\u00fbt du d\u00e9veloppement et de la maintenance. \u00bb<\/p><\/blockquote>\n<p>La proposition d&rsquo;inclure JIT dans PHP 8 a \u00e9t\u00e9 adopt\u00e9e par 50 voix contre 2.<\/p>\n\n<h2>Am\u00e9liorations et nouvelles fonctionnalit\u00e9s de PHP 8<\/h2>\n<p>En dehors de JIT, nous pouvons nous attendre \u00e0 de nombreuses fonctionnalit\u00e9s et am\u00e9liorations avec PHP 8. La liste suivante est notre s\u00e9lection des ajouts et changements \u00e0 venir qui devraient rendre PHP plus fiable et plus efficace.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"17\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Constructor Property Promotion<\/h3>\n<p>Suite \u00e0 une discussion en cours sur la fa\u00e7on d&rsquo;am\u00e9liorer <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">l&rsquo;ergonomie des objets en PHP<\/a>, le <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">RFC \u00ab\u00a0Constructor Property Promotion\u00a0\u00bb<\/a> propose une nouvelle syntaxe plus concise qui simplifiera la d\u00e9claration de propri\u00e9t\u00e9, la rendant plus courte et moins redondante.<\/p>\n<p>Cette proposition ne concerne que les \u201c<strong>promoted parameters<\/strong>\u201d ou param\u00e8tres promus, c&rsquo;est-\u00e0-dire les param\u00e8tres de m\u00e9thode pr\u00e9fix\u00e9s par des mots-cl\u00e9s <strong>de visibilit\u00e9 publique<\/strong>, prot\u00e9g\u00e9e et <strong>priv\u00e9e<\/strong>.<\/p>\n<p>Actuellement, toutes les propri\u00e9t\u00e9s doivent \u00eatre r\u00e9p\u00e9t\u00e9es plusieurs fois (au moins quatre fois) avant que nous puissions les utiliser avec des objets. Consid\u00e9rons l&rsquo;exemple suivant, tir\u00e9 du RFC :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/span><\/pre>\n<p>Selon Nikita Popov, l&rsquo;auteure du RFC, nous devons \u00e9crire le nom de la propri\u00e9t\u00e9 au moins quatre fois \u00e0 trois endroits diff\u00e9rents : la d\u00e9claration de propri\u00e9t\u00e9, les param\u00e8tres du constructeur et l&rsquo;affectation de la propri\u00e9t\u00e9. Cette syntaxe n&rsquo;est pas particuli\u00e8rement utilisable, surtout dans les classes ayant un bon nombre de propri\u00e9t\u00e9s et des noms plus descriptifs.<\/p>\n<p>Ce RFC propose de fusionner le constructeur et la d\u00e9finition des param\u00e8tres. Ainsi, \u00e0 partir de PHP 8, nous disposons d&rsquo;une fa\u00e7on plus utilisable de d\u00e9clarer les param\u00e8tres et le code vu ci-dessus peut changer comme indiqu\u00e9 ci-dessous :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/span><\/pre>\n<p>Et c&rsquo;est tout. Nous avons donc une nouvelle fa\u00e7on de promouvoir les propri\u00e9t\u00e9s qui est plus courte, plus lisible et moins sujette aux erreurs. <a href=\"https:\/\/phpinternals.news\/53\">Selon Nikita<\/a> :<\/p>\n<blockquote><p>C&rsquo;est une simple transformation syntaxique que nous faisons. Mais cela r\u00e9duit la quantit\u00e9 de code passe-partout que vous devez \u00e9crire pour les objets de valeur en particulier&#8230;<\/p><\/blockquote>\n<p>La d\u00e9claration de propri\u00e9t\u00e9 est transform\u00e9e comme nous avions explicitement d\u00e9clar\u00e9 ces propri\u00e9t\u00e9s et nous pouvons utiliser l&rsquo;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">API Reflection<\/a> pour introspecter les d\u00e9finitions de propri\u00e9t\u00e9 avant l&rsquo;ex\u00e9cution (voir <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>) :<\/p>\n<blockquote><p>La r\u00e9flexion (et autres m\u00e9canismes d&rsquo;introspection) permettra d&rsquo;observer l&rsquo;\u00e9tat apr\u00e8s le \u201cdesugaring\u201d. Cela signifie que les propri\u00e9t\u00e9s promues appara\u00eetront de la m\u00eame mani\u00e8re que les propri\u00e9t\u00e9s explicitement d\u00e9clar\u00e9es, et que les arguments du constructeur promu appara\u00eetront comme des arguments du constructeur ordinaire.<span style=\"color: #ff0000\"><br \/>\n<\/span><\/p><\/blockquote>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/span><\/pre>\n<h4>Inheritance<\/h4>\n<p>Nous n&rsquo;avons aucune limite \u00e0 l&rsquo;utilisation de l&rsquo;h\u00e9ritage en conjonction avec des param\u00e8tres promus. De toute fa\u00e7on, il n&rsquo;y a pas de relation particuli\u00e8re entre les constructeurs de classes de parents et d&rsquo;enfants. <a href=\"https:\/\/phpinternals.news\/53\">Selon Nikita<\/a> :<\/p>\n<blockquote><p>Habituellement, nous disons que les m\u00e9thodes doivent toujours \u00eatre compatibles avec la m\u00e9thode m\u00e8re. [&#8230;] mais cette r\u00e8gle ne s&rsquo;applique pas au constructeur. Ainsi, le constructeur appartient r\u00e9ellement \u00e0 une seule classe, et les constructeurs entre la classe parent et la classe enfant n&rsquo;ont pas \u00e0 \u00eatre compatibles d&rsquo;une quelconque mani\u00e8re.<span style=\"color: #ff0000\"><br \/>\n<\/span><\/p><\/blockquote>\n<p>Voici un exemple:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/span><\/pre>\n<h4>Ce qui n&rsquo;est pas autoris\u00e9 avec les propri\u00e9t\u00e9s promues<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h4>\n<p>Les propri\u00e9t\u00e9s promues sont autoris\u00e9es dans les constructeurs et les traits non abstraits, mais il y a plusieurs limitations qui m\u00e9ritent d&rsquo;\u00eatre mentionn\u00e9es ici.<\/p>\n<h5>Constructeurs abstraits<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h5>\n<p>Les propri\u00e9t\u00e9s promues ne sont pas autoris\u00e9es dans les classes et les interfaces abstraites :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/span><\/pre>\n<h5>Nullabilit\u00e9<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h5>\n<p>L&rsquo;une des contraintes les plus notables est li\u00e9e \u00e0 l&rsquo;annulabilit\u00e9. Auparavant, lorsque nous utilisions un type qui n&rsquo;\u00e9tait pas explicitement annulable, mais avec une valeur par d\u00e9faut nulle, le type \u00e9tait implicitement annulable. Mais avec les types de propri\u00e9t\u00e9, nous n&rsquo;avons pas ce comportement implicite car les param\u00e8tres promus n\u00e9cessitent une d\u00e9claration de propri\u00e9t\u00e9, et le type annulable doit \u00eatre explicitement d\u00e9clar\u00e9. Voir l&rsquo;exemple suivant de la RFC :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/span><\/pre>\n<h5>Callable Type<\/h5>\n<p>Comme le type callable n&rsquo;est <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#typed-properties\">pas pris en charge pour les propri\u00e9t\u00e9s<\/a>, nous ne sommes pas autoris\u00e9s \u00e0 utiliser le type callable dans les propri\u00e9t\u00e9s promues :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/span><\/pre>\n<h5>Le mot-cl\u00e9 var n&rsquo;est pas autoris\u00e9<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h5>\n<p>Seul un mot-cl\u00e9 de visibilit\u00e9 peut \u00eatre utilis\u00e9 avec les param\u00e8tres promus, donc la d\u00e9claration des propri\u00e9t\u00e9s du constructeur avec le mot-cl\u00e9 <code>var<\/code> n&rsquo;est pas autoris\u00e9e (voir l&rsquo;exemple suivant du RFC) :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/span><\/pre>\n<h5>Aucune duplication autoris\u00e9<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h5>\n<p>Nous pouvons combiner des propri\u00e9t\u00e9s promues et des propri\u00e9t\u00e9s explicites dans la m\u00eame classe, mais les propri\u00e9t\u00e9s ne peuvent pas \u00eatre d\u00e9clar\u00e9es deux fois :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/span><\/pre>\n<h5>Les param\u00e8tres variadiques ne sont pas autoris\u00e9s<\/h5>\n<p>La raison en est que le type d\u00e9clar\u00e9 est diff\u00e9rent du param\u00e8tre variadique, qui est en fait un tableau :<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/span><\/pre>\n<h4>Lectures compl\u00e9mentaires<span style=\"color: #ff0000\"><br \/>\n<\/span><\/h4>\n<p>Pour en savoir plus sur Costructor Property Promotion, \u00e9coutez cette <a href=\"https:\/\/phpinternals.news\/53\">interview de Nikita Popov<\/a>. Pour un aper\u00e7u d\u00e9taill\u00e9 de l&rsquo;ergonomie des objets en PHP, <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">voir ce post<\/a> et <a href=\"https:\/\/phpinternals.news\/51\">l&rsquo;interview suivante avec Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validation pour les m\u00e9thodes de traits abstraits<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">Les traits<\/a> sont d\u00e9finis comme \u00ab\u00a0un m\u00e9canisme de r\u00e9utilisation de code dans des langages \u00e0 h\u00e9ritage unique tels que PHP\u00a0\u00bb. Ils sont g\u00e9n\u00e9ralement utilis\u00e9s pour d\u00e9clarer des m\u00e9thodes qui peuvent \u00eatre utilis\u00e9es dans plusieurs classes.<\/p>\n<p>Un trait peut \u00e9galement contenir des m\u00e9thodes abstraites. Ces m\u00e9thodes d\u00e9clarent simplement la signature de la m\u00e9thode, mais l&rsquo;impl\u00e9mentation de la m\u00e9thode doit \u00eatre faite au sein de la classe qui utilise le trait.<\/p>\n<p>Selon le <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">manuel de PHP<\/a>,<\/p>\n<blockquote><p>\u00ab\u00a0Les traits prennent en charge l&rsquo;utilisation de m\u00e9thodes abstraites afin d&rsquo;imposer des exigences \u00e0 la classe exposante\u00a0\u00bb.<\/p><\/blockquote>\n<p>Cela signifie \u00e9galement que les signatures des m\u00e9thodes doivent correspondre. En d&rsquo;autres termes, le type et le nombre d&rsquo;arguments n\u00e9cessaires <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\">doivent \u00eatre les m\u00eames<\/a>.<\/p>\n<p>Quoi qu&rsquo;il en soit, <a href=\"https:\/\/externals.io\/message\/108065#108164\">selon Nikita Popov,<\/a> auteur de la RFC, la validation des signatures n&rsquo;est actuellement impos\u00e9e que de mani\u00e8re ponctuelle :<\/p>\n<blockquote>\n<ul>\n<li>Elle n&rsquo;est pas impos\u00e9e dans le cas le plus courant, o\u00f9 l&rsquo;application de la m\u00e9thode est fournie par l\u2019utilisation de la classe \u00a0: <a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Elle est impos\u00e9e si l\u2019impl\u00e9mentation provient d&rsquo;une classe parente : <a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Elle est impos\u00e9e si l\u2019impl\u00e9mentation provient d&rsquo;une classe enfant : <a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<\/blockquote>\n<p>L&rsquo;exemple suivant de Nikita concerne le premier cas (signature non impos\u00e9e) :<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Cela \u00e9tant dit, <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">cette RFC<\/a> propose de toujours lancer une erreur fatale si la m\u00e9thode de mise en \u0153uvre n&rsquo;est pas compatible avec la m\u00e9thode des traits abstraits, quelle que soit son origine :<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Cette RFC a \u00e9t\u00e9 approuv\u00e9e \u00e0 l&rsquo;unanimit\u00e9.<\/p>\n<h3 id=\"incompatible-method-signatures\">Signatures de m\u00e9thodes incompatibles<\/h3>\n<p>En PHP, les erreurs d&rsquo;h\u00e9ritage d\u00fbes \u00e0 des signatures de m\u00e9thodes incompatibles d\u00e9clenchent soit une erreur fatale, soit un avertissement selon la cause de l&rsquo;erreur.<\/p>\n<p>Si une classe impl\u00e9mente une interface, les signatures de m\u00e9thodes incompatibles entra\u00eenent une erreur fatale. Selon la <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">documentation sur les interfaces objet<\/a> :<\/p>\n<blockquote><p>\u00ab\u00a0La classe qui impl\u00e9mente l&rsquo;interface doit utiliser une signature de m\u00e9thode qui est compatible avec le LSP (Liskov Substitution Principle). Ne pas le faire entra\u00eenera une erreur fatale\u00a0\u00bb.<\/p><\/blockquote>\n<p>Voici un exemple d&rsquo;<a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">erreur d&rsquo;h\u00e9ritage avec une interface<\/a> :<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>Dans PHP 7.4, le code ci-dessus entra\u00eenerait l&rsquo;erreur suivante :<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Une fonction dans une classe enfant avec une signature incompatible lancerait un avertissement. Voir le code suivant de la RFC :<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>Dans PHP 7.4, le code ci-dessus lancerait simplement un avertissement :<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Or, <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">cette RFC<\/a> propose de toujours lancer une erreur fatale pour les signatures de m\u00e9thodes incompatibles. Avec PHP 8, le code que nous avons vu plus haut d\u00e9clencherait ce qui suit :<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Tableaux commen\u00e7ant par un index n\u00e9gatif<\/h3>\n<p>En PHP, si un tableau commence par un index n\u00e9gatif (<code>start_index &lt; 0<\/code>), les indices suivants partiront de 0 (plus d&rsquo;informations \u00e0 ce sujet dans la <a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\">documentation de <code>array_fill<\/code>)<\/a>. Regardez l&rsquo;exemple suivant :<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>Dans PHP 7.4, le r\u00e9sultat serait le suivant :<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Maintenant, <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">cette RFC<\/a> propose de changer les choses de mani\u00e8re \u00e0 ce que le deuxi\u00e8me indice soit <code>start_index + 1<\/code>, quelle que soit la valeur de <code>start_index<\/code>.<\/p>\n<p>Dans PHP 8, le code ci-dessus donnerait le tableau suivant :<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Avec PHP 8, les tableaux commen\u00e7ant par un index n\u00e9gatif modifient leur comportement. Pour en savoir plus sur les incompatibilit\u00e9s ascendantes dans <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">la RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\">Types d\u2019union 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Les types d&rsquo;union<\/a> (Union Types) acceptent des valeurs qui peuvent \u00eatre de diff\u00e9rents types. Actuellement, PHP ne fournit pas de support pour les types d&rsquo;union, \u00e0 l&rsquo;exception de la syntaxe <code>?Type<\/code> et du type sp\u00e9cial <code>iterable<\/code>.<\/p>\n<p>Avant PHP 8, les types d&rsquo;Union ne pouvaient \u00eatre sp\u00e9cifi\u00e9s que dans les annotations phpdoc, comme le montre l&rsquo;exemple suivant de la RFC :<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Maintenant, <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">la RFC des types d\u2019Union 2.0<\/a> propose d&rsquo;ajouter la prise en charge des types d&rsquo;Union dans les signatures de fonctions, de sorte que nous ne d\u00e9pendrons plus de la documentation en ligne, mais d\u00e9finirons les types d&rsquo;Union avec une syntaxe <code>T1|T2|...<\/code> \u00e0 la place :<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Comme l&rsquo;explique Nikita Popov dans la RFC,<\/p>\n<blockquote><p>\u00ab La prise en charge des types d\u2019Union dans le language nous permet de d\u00e9placer davantage d&rsquo;informations de type du phpdoc vers les signatures de fonction, avec les avantages habituels que cela apporte :<\/p>\n<ul>\n<li>Les types sont effectivement impos\u00e9s, de sorte que les erreurs peuvent \u00eatre d\u00e9tect\u00e9es \u00e0 temps.<\/li>\n<li>Parce qu&rsquo;elles sont impos\u00e9es, les informations de type sont moins susceptibles de devenir obsol\u00e8tes ou de manquer les \u00ab\u00a0edge-cases\u00a0\u00bb.<\/li>\n<li>Les types sont v\u00e9rifi\u00e9s lors de l\u2019h\u00e9ritage, en appliquant le principe de substitution de Liskov.<\/li>\n<li>Les types sont disponibles par l&rsquo;interm\u00e9diaire de Reflection.<\/li>\n<li>La syntaxe est beaucoup moins passe-partout que celle de phpdoc\u00a0\u00bb.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Les types d&rsquo;Union prennent en charge tous les types disponibles, avec certaines limitations :<\/p>\n<ul>\n<li>Le type <code>void<\/code> ne pourrait pas faire partie d&rsquo;une union, car <code>void<\/code> signifie qu&rsquo;une fonction ne <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">retourne aucune valeur<\/a>.<\/li>\n<li>Le type <code>null<\/code> n\u2019est pris en charge que dans les types d\u2019union, mais son utilisation en tant que type autonome n&rsquo;est pas autoris\u00e9e.<\/li>\n<li>La notation de type nullable (<code>?T<\/code>) est \u00e9galement autoris\u00e9e, c&rsquo;est-\u00e0-dire <code>T|null<\/code>, mais nous ne sommes pas autoris\u00e9s \u00e0 inclure la notation <code>?T<\/code> dans les types d&rsquo;union (<code>?T1|T2<\/code> n\u2019est pas autoris\u00e9 et nous devrions utiliser <code>T1|T2|null<\/code> \u00e0 la place).<\/li>\n<li>Comme de nombreuses fonctions (c&rsquo;est-\u00e0-dire <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, etc.) incluent <code>false<\/code> parmi les types de retour possibles, le pseudo-type <code>false<\/code> est \u00e9galement pris en charge.<\/li>\n<\/ul>\n<p>Vous pouvez en savoir plus sur les <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">types d&rsquo;Union V2<\/a> dans la RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Erreurs de type coh\u00e9rentes pour les fonctions internes<\/h3>\n<p>Lors du passage d&rsquo;un param\u00e8tre de type ill\u00e9gal, les fonctions\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\">internes<\/a> et celles <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">d\u00e9finies par l&rsquo;utilisateur<\/a> se comportent diff\u00e9remment.<\/p>\n<p>Les fonctions d\u00e9finies par l&rsquo;utilisateur provoquent une <code>TypeError<\/code>, mais les fonctions internes se comportent de diff\u00e9rentes mani\u00e8res, selon plusieurs conditions. Quoi qu&rsquo;il en soit, le comportement typique est de lancer un avertissement et de retourner <code>null<\/code>. Voir l&rsquo;exemple suivant en PHP 7.4 :<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Il en r\u00e9sulterait l&rsquo;avertissement suivant :<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Si <code>strict_types<\/code> est activ\u00e9, ou si les informations sur les arguments sp\u00e9cifient les types, le comportement sera diff\u00e9rent. Dans de tels sc\u00e9narios, l&rsquo;erreur de type est d\u00e9tect\u00e9e et entra\u00eene une <code>TypeError<\/code>.<\/p>\n<p>Cette situation entra\u00eenerait un certain nombre de probl\u00e8mes bien expliqu\u00e9s dans <code>la section des questions de la RFC<\/code>.<\/p>\n<p>Pour supprimer ces incoh\u00e9rences, <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">cette RFC propose<\/a> de faire en sorte que les APIs d&rsquo;analyse des param\u00e8tres internes g\u00e9n\u00e8rent toujours une <code>ThrowError<\/code> en cas de non-concordance d&rsquo;un type de param\u00e8tre.<\/p>\n<p>Dans PHP 8, le code ci-dessus provoque l&rsquo;erreur suivante :<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">Expression throw<\/h3>\n<p>Dans PHP, <code>throw<\/code> est une <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">d\u00e9claration,<\/a> il n&rsquo;est donc pas possible de l&rsquo;utiliser dans les endroits o\u00f9 seule une <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">expression<\/a> est autoris\u00e9e.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Cette RFC<\/a> propose de convertir la <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\">d\u00e9claration <code>throw<\/code><\/a> en une expression afin qu&rsquo;elle puisse \u00eatre utilis\u00e9e dans tout contexte o\u00f9 les expressions sont autoris\u00e9es. Par exemple, les <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#arrow-functions\">fonctions arrow<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">l\u2019op\u00e9rateur coalesce<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">les op\u00e9rateurs ternary et elvis operators<\/a>, etc.<\/p>\n<p>Voyez les exemples suivants de la RFC :<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\">Weak Maps<\/h3>\n<p>Weak Map est un ensemble de donn\u00e9es (objets) dans lequel les cl\u00e9s sont faiblement r\u00e9f\u00e9renc\u00e9es, ce qui signifie qu&rsquo;elles ne sont pas emp\u00each\u00e9es d&rsquo;\u00eatre collect\u00e9es.<\/p>\n<p>PHP 7.4 a ajout\u00e9 la prise en charge des <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-4\/#weakreferences\">r\u00e9f\u00e9rences faibles<\/a> comme moyen de conserver une r\u00e9f\u00e9rence \u00e0 un objet qui n&#8217;emp\u00eache pas l&rsquo;objet lui-m\u00eame d&rsquo;\u00eatre d\u00e9truit. Comme l&rsquo;a soulign\u00e9 Nikita Popov,<\/p>\n<blockquote><p>\u00ab\u00a0Les r\u00e9f\u00e9rences brutes faibles n&rsquo;ont qu&rsquo;une utilit\u00e9 limit\u00e9e en soi et les weak maps sont beaucoup plus couramment utilis\u00e9es dans la pratique. Il n&rsquo;est pas possible de mettre en \u0153uvre une weak map efficace en plus des r\u00e9f\u00e9rences faibles de PHP parce que la possibilit\u00e9 d&rsquo;enregistrer un callback de destruction n&rsquo;est pas pr\u00e9vue\u00a0\u00bb.<\/p><\/blockquote>\n<p>C&rsquo;est pourquoi <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">cette RFC<\/a> introduit une classe <code>WeakMap<\/code> pour cr\u00e9er des objets \u00e0 utiliser comme cl\u00e9s de weak map qui peuvent \u00eatre d\u00e9truites et retir\u00e9es de la weak map s&rsquo;il n&rsquo;y a pas d&rsquo;autres r\u00e9f\u00e9rences \u00e0 l&rsquo;objet cl\u00e9.<\/p>\n<p>Dans les processus de longue dur\u00e9e, cela permettrait d&rsquo;\u00e9viter les fuites de m\u00e9moire et d&rsquo;am\u00e9liorer les performances. Voir l&rsquo;exemple suivant de la RFC :<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Avec PHP 8, le code ci-dessus produirait le r\u00e9sultat suivant (voir le <a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">code en action ici<\/a>) :<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Si vous d\u00e9sactivez l&rsquo;objet, la cl\u00e9 est automatiquement retir\u00e9e de la weak map :<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Le r\u00e9sultat serait maintenant le suivant :<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Pour un examen plus approfondi des weaks maps, voir <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">la RFC<\/a>. La proposition a \u00e9t\u00e9 approuv\u00e9e \u00e0 l&rsquo;unanimit\u00e9.<\/p>\n<h3 id=\"trailing-commas\">Virgule de fin dans la liste des param\u00e8tres<\/h3>\n<p>Les virgules de fin de ligne sont des virgules annex\u00e9es \u00e0 des listes d&rsquo;\u00e9l\u00e9ments dans diff\u00e9rents contextes. PHP 7.2 a introduit les virgules de fin de <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">liste dans la syntaxe des listes<\/a>, PHP 7.3 a introduit les virgules de fin de <a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">liste dans<\/a><a href=\"https:\/\/kinsta.com\/fr\/blog\/php-7-3\/#trailing-comma-in-function-calls\"> les appels de fonction<\/a>.<\/p>\n<p>PHP 8 introduit d\u00e9sormais des <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">virgules de fin de ligne dans les listes de param\u00e8tres<\/a> avec les fonctions, les m\u00e9thodes et les fermetures, comme le montre l&rsquo;exemple suivant :<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>Cette proposition a \u00e9t\u00e9 adopt\u00e9e par 58 voix contre 1.<\/p>\n<h3 id=\"class-syntax-on-objects\">Allow :: Syntaxe de classe sur les objets<\/h3>\n<p>Afin d&rsquo;obtenir le nom d&rsquo;une classe, nous pouvons utiliser la syntaxe <code>Foo\\Bar::class<\/code>. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Cette RFC<\/a> propose d&rsquo;\u00e9tendre la m\u00eame syntaxe aux objets, de sorte qu&rsquo;il est maintenant possible de r\u00e9cup\u00e9rer le nom de la classe d&rsquo;un objet donn\u00e9, comme le montre l&rsquo;exemple ci-dessous :<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>Avec PHP 8, <code>$object::class<\/code> fournit le m\u00eame r\u00e9sultat que <code>get_class($object)<\/code>. Si <code>$object<\/code> n&rsquo;est pas un objet, il lance une exception <code>TypeError<\/code>.<\/p>\n<p>Cette proposition a \u00e9t\u00e9 approuv\u00e9e \u00e0 l&rsquo;unanimit\u00e9.<\/p>\n<h3 id=\"attributes\">Attributs v2<\/h3>\n<p>Les attributs, \u00e9galement appel\u00e9s annotations, sont une forme de m\u00e9tadonn\u00e9es structur\u00e9es qui peuvent \u00eatre utilis\u00e9es pour sp\u00e9cifier les propri\u00e9t\u00e9s des objets, des \u00e9l\u00e9ments ou des fichiers.<\/p>\n<p>Jusqu&rsquo;\u00e0 la version 7.4 de PHP, les doc-comments \u00e9taient le seul moyen d&rsquo;ajouter des m\u00e9tadonn\u00e9es aux d\u00e9clarations de classes, fonctions, etc. Maintenant, la <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC Attributs v2<\/a> introduit des attributs pour PHP en les d\u00e9finissant comme une forme de m\u00e9tadonn\u00e9es structur\u00e9es et syntaxiques qui peuvent \u00eatre ajout\u00e9es aux d\u00e9clarations de classes, propri\u00e9t\u00e9s, fonctions, m\u00e9thodes, param\u00e8tres et constantes.<\/p>\n<p>Les attributs sont ajout\u00e9s avant les d\u00e9clarations auxquelles ils se r\u00e9f\u00e8rent. Voir les exemples suivants de la RFC :<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\nclass Foo\n{\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic $x;\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic function foo(&lt;&lt;ExampleAttribute&gt;&gt; $bar) { }\n}\n\n$object = new &lt;&lt;ExampleAttribute&gt;&gt; class () { };\n\n&lt;&lt;ExampleAttribute&gt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&lt;ExampleAttribute&gt;&gt; function () { };\n\n$f3 = &lt;&lt;ExampleAttribute&gt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Les attributs peuvent \u00eatre ajout\u00e9s avant ou apr\u00e8s un commentaire de doc-block :<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\n\/** docblock *\/\n&lt;&lt;AnotherExampleAttribute&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Chaque d\u00e9claration peut avoir un ou plusieurs attributs et chaque attribut peut avoir une ou plusieurs valeurs associ\u00e9es :<\/p>\n<pre><code class=\"language-php\">&lt;&lt;WithoutArgument&gt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Voir la <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC<\/a> pour un aper\u00e7u plus d\u00e9taill\u00e9 des attributs PHP, des cas d&rsquo;utilisation et de la syntaxe alternative. Notez que la version 2 des attributs est actuellement en cours d&rsquo;impl\u00e9mentation.<\/p>\n<h3 id=\"named-arguments\">Arguments nomm\u00e9s<\/h3>\n<p>Les <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">arguments nomm\u00e9s<\/a> fournissent une nouvelle fa\u00e7on de passer des arguments \u00e0 une fonction dans le PHP :<\/p>\n<blockquote><p>Les arguments nomm\u00e9s permettent de passer des arguments \u00e0 une fonction en fonction du nom du param\u00e8tre, plut\u00f4t que de la position du param\u00e8tre.<\/p><\/blockquote>\n<p>Nous pouvons passer des arguments nomm\u00e9s \u00e0 une fonction en ajoutant simplement le nom du param\u00e8tre avant sa valeur :<\/p>\n<pre><code class=\"language-php\">callFunction(name: $value);<\/code><\/pre>\n<p>Nous sommes \u00e9galement autoris\u00e9s \u00e0 utiliser des mots-cl\u00e9s r\u00e9serv\u00e9s, comme le montre l&rsquo;exemple ci-dessous :<\/p>\n<pre><code class=\"language-php\">callFunction(array: $value);<\/code><\/pre>\n<p>Mais nous ne sommes pas autoris\u00e9s \u00e0 passer un nom de param\u00e8tre de mani\u00e8re dynamique. Le param\u00e8tre doit \u00eatre un identifiant et <strong>la syntaxe suivante n&rsquo;est pas autoris\u00e9e <\/strong>:<\/p>\n<pre><code class=\"language-php\">callFunction($name: $value);<\/code><\/pre>\n<p>Selon Nikita Popov, l&rsquo;auteur de ce RFC, les arguments nomm\u00e9s offrent plusieurs avantages.<\/p>\n<p>Tout d&rsquo;abord, les arguments nomm\u00e9s nous aideront \u00e0 \u00e9crire un code plus compr\u00e9hensible parce que leur signification est autodocument\u00e9e. L&rsquo;exemple ci-dessous, tir\u00e9 du RFC, s&rsquo;explique d&rsquo;lui-m\u00eame :<\/p>\n<pre><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/pre>\n<p>Les arguments nomm\u00e9s sont ind\u00e9pendants de l&rsquo;ordre. Cela signifie que nous ne sommes pas oblig\u00e9s de transmettre les arguments \u00e0 une fonction dans le m\u00eame ordre que la signature de la fonction :<\/p>\n<pre><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/pre>\n<p>Il est \u00e9galement possible de combiner des arguments nomm\u00e9s avec des arguments de position :<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p>Un autre grand avantage des arguments nomm\u00e9s est qu&rsquo;ils permettent de sp\u00e9cifier uniquement les arguments que nous voulons r\u00e9ellement changer et que nous n&rsquo;avons pas \u00e0 sp\u00e9cifier d&rsquo;arguments par d\u00e9faut si nous ne voulons pas \u00e9craser les valeurs par d\u00e9faut. L&rsquo;exemple suivant, tir\u00e9 de la RFC, le montre clairement :<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p><aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Si vous \u00eates un <a href=\"https:\/\/kinsta.com\/fr\/blog\/engager-developpeur-wordpress\/\">d\u00e9veloppeur WordPress<\/a>, veuillez noter qu&rsquo;au moment de la r\u00e9daction de ce document, les arguments nomm\u00e9s peuvent entra\u00eener <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-5-6\/#named-parameters\">des probl\u00e8mes de r\u00e9trocompatibilit\u00e9<\/a>. Ne les utilisez pas en production sans les avoir test\u00e9s de mani\u00e8re approfondie<\/p>\n<\/aside>\n.<\/p>\n<p>Named arguments can be used with <a href=\"#attributes\">PHP attributes<\/a>, as shown in the following example from the RFC:<\/p>\n<p>Les arguments nomm\u00e9s peuvent \u00eatre utilis\u00e9s avec les <a href=\"#attributes\">attributs PHP<\/a>, comme le montre l&rsquo;exemple suivant de la RFC :<\/p>\n<pre><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/pre>\n<p>Toutefois, il n&rsquo;est pas permis de faire passer des arguments de position apr\u00e8s des arguments nomm\u00e9s, ce qui entra\u00eenerait une erreur de compilation. La m\u00eame chose se produit lorsque l&rsquo;on passe deux fois le m\u00eame nom de param\u00e8tre.<\/p>\n<p>Les arguments nomm\u00e9s sont particuli\u00e8rement utiles pour les d\u00e9clarations de classe car les constructeurs ont g\u00e9n\u00e9ralement un grand nombre de param\u00e8tres et les arguments nomm\u00e9s fournissent une mani\u00e8re plus \u00ab\u00a0ergonomique\u00a0\u00bb de d\u00e9clarer une classe.<\/p>\n<p>Pour en savoir plus sur les \u00ab\u00a0Named Arguments\u00a0\u00bb, avec les contraintes, les incompatibilit\u00e9s r\u00e9troactives et plusieurs exemples, voir <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">le RFC \u00ab\u00a0Named Arguments\u00a0\u00bb<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Op\u00e9rateur Nullsafe<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Ce RFC<\/a> introduit l&rsquo;op\u00e9rateur nullsafe <code>$-&gt;<\/code> avec \u00e9valuation <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">compl\u00e8te du court-circuit<\/a>.<\/p>\n<p>Dans l&rsquo;\u00e9valuation de court-circuit, le second op\u00e9rateur n&rsquo;est \u00e9valu\u00e9 que si le premier op\u00e9rateur n&rsquo;\u00e9value pas \u00e0 <code>null<\/code>. Si un op\u00e9rateur d&rsquo;une cha\u00eene est \u00e9valu\u00e9 \u00e0 <code>null<\/code>, l&rsquo;ex\u00e9cution de la cha\u00eene enti\u00e8re s&rsquo;arr\u00eate et est \u00e9valu\u00e9e \u00e0 <code>null<\/code>.<\/p>\n<p>Examinez les exemples suivants du RFC :<\/p>\n<pre><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/pre>\n<p>Si <code>$a<\/code> est nul, la m\u00e9thode <code>b()<\/code> n&rsquo;est pas appel\u00e9e et <code>$foo<\/code> est mis \u00e0 <code>null<\/code>.<\/p>\n<p>Voir l&rsquo;op\u00e9rateur <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">nullsafe RFC<\/a> pour des exemples suppl\u00e9mentaires, les exceptions et le champ d&rsquo;application futur.<\/p>\n<h3 id=\"string-to-number-comparison\">Comparaisons entre les cha\u00eenes de Saner et les num\u00e9ros<\/h3>\n<p>Dans les versions pr\u00e9c\u00e9dentes de PHP, lors d&rsquo;une comparaison non stricte entre des cha\u00eenes de caract\u00e8res et des nombres, PHP attribue d&rsquo;abord la cha\u00eene \u00e0 un nombre, puis effectue la comparaison entre des nombres entiers ou flottants. M\u00eame si ce comportement est tr\u00e8s utile dans plusieurs sc\u00e9narios, il peut produire des r\u00e9sultats erron\u00e9s qui peuvent \u00e9galement conduire \u00e0 des bogues et\/ou des probl\u00e8mes de s\u00e9curit\u00e9.<\/p>\n<p>Consid\u00e9rons l&rsquo;exemple suivant du RFC :<\/p>\n<pre><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/pre>\n<p>Le PHP 8 introduit <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">les comparaisons entre cha\u00eenes de Saner et nombres<\/a>, visant \u00e0 rendre les comparaisons entre cha\u00eenes et nombres plus raisonnables. Selon les termes de Nikita Popov,<\/p>\n<blockquote><p>Ce RFC vise \u00e0 donner aux comparaisons de cha\u00eenes de chiffres un comportement plus raisonnable : Lors de la comparaison avec une cha\u00eene num\u00e9rique, utilisez une comparaison de nombres (comme maintenant). Sinon, convertissez le nombre en cha\u00eene de caract\u00e8res et utilisez une comparaison de cha\u00eenes de caract\u00e8res.<\/p><\/blockquote>\n<p>Le tableau suivant compare le comportement de la comparaison des cha\u00eenes et des num\u00e9ros dans les versions ant\u00e9rieures de PHP et dans PHP 8 :<\/p>\n<pre>Comparison    | Before | After\n------------------------------\n 0 == \"0\"     | true   | true\n 0 == \"0.0\"   | true   | true\n <strong>0 == \"foo\"   | true   | false<\/strong>\n <strong>0 == \"\"      | true   | false<\/strong>\n42 == \"   42\" | true   | true\n<strong>42 == \"42foo\" | true   | false<\/strong><\/pre>\n<p>Pour en savoir plus sur les nombreuses implications de ce changement et sur la fa\u00e7on dont les comparaisons entre cha\u00eenes et nombres changent en PHP 8, lisez <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">le RFC officiel de Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Saner Cha\u00eenes num\u00e9riques<\/h3>\n<p>En PHP, les cha\u00eenes de caract\u00e8res contenant des chiffres se r\u00e9partissent en <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">trois cat\u00e9gories<\/a> :<\/p>\n<ul>\n<li><strong>Cha\u00eenes num\u00e9riques <\/strong>: cha\u00eenes contenant un nombre \u00e9ventuellement pr\u00e9c\u00e9d\u00e9 d&rsquo;espaces.<\/li>\n<li><strong>Cha\u00eene num\u00e9rique de t\u00eate <\/strong>: cha\u00eenes dont les caract\u00e8res initiaux sont des cha\u00eenes num\u00e9riques et les caract\u00e8res finaux des cha\u00eenes non num\u00e9riques.<\/li>\n<li><strong>Cha\u00eene non num\u00e9rique <\/strong>: cha\u00eenes n&rsquo;entrant dans aucune des cat\u00e9gories pr\u00e9c\u00e9dentes.<\/li>\n<\/ul>\n<p>Les cha\u00eenes num\u00e9riques et les cha\u00eenes num\u00e9riques principales sont trait\u00e9es diff\u00e9remment selon l&rsquo;op\u00e9ration effectu\u00e9e. Par exemple, les cha\u00eenes num\u00e9riques et les cha\u00eenes de chiffres de t\u00eate sont trait\u00e9es diff\u00e9remment selon l&rsquo;op\u00e9ration effectu\u00e9e :<\/p>\n<ul>\n<li><strong>Les conversions explicites de cha\u00eenes de caract\u00e8res en nombres <\/strong>(c&rsquo;est-\u00e0-dire les caract\u00e8res <code>(int)<\/code> et <code>(float)<\/code>) convertissent les nombres num\u00e9riques et les cha\u00eenes de caract\u00e8res \u00e0 chiffres de t\u00eate. La conversion explicite d&rsquo;une cha\u00eene non num\u00e9rique en un nombre produit 0.<\/li>\n<li>Les <strong>conversions implicites de cha\u00eenes de caract\u00e8res en nombres <\/strong>(c&rsquo;est-\u00e0-dire sans d\u00e9claration de <code>strict_type<\/code>) donnent des r\u00e9sultats diff\u00e9rents pour les cha\u00eenes de caract\u00e8res num\u00e9riques et non num\u00e9riques. Les conversions de cha\u00eenes non num\u00e9riques en nombres entra\u00eenent une erreur de type (<code>TypeError<\/code>).<\/li>\n<li><code>is_numeric()<\/code> renvoie <strong>vrai <\/strong>uniquement pour les cha\u00eenes de caract\u00e8res num\u00e9riques.<\/li>\n<\/ul>\n<p>Les d\u00e9calages de cha\u00eene, les op\u00e9rations arithm\u00e9tiques, les op\u00e9rations d&rsquo;incr\u00e9mentation et de d\u00e9cr\u00e9mentation, les comparaisons de cha\u00eene \u00e0 cha\u00eene et les op\u00e9rations bit par bit donnent \u00e9galement des r\u00e9sultats diff\u00e9rents.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Ce RFC<\/a> se propose de :<\/p>\n<blockquote><p>Unifier les diff\u00e9rents modes de cha\u00eenes num\u00e9riques en un seul concept : Caract\u00e8res num\u00e9riques uniquement avec les espaces avant et arri\u00e8re autoris\u00e9s. Tout autre type de cha\u00eene n&rsquo;est pas num\u00e9rique et entra\u00eenera des erreurs typographiques lorsqu&rsquo;il sera utilis\u00e9 dans un contexte num\u00e9rique.<\/p><\/blockquote>\n<blockquote><p>Cela signifie que toutes les cha\u00eenes qui \u00e9mettent actuellement le <strong>E_NOTICE<\/strong> \u00ab\u00a0A non well formed numeric value encountered\u00a0\u00bb seront reclass\u00e9es en <strong>E_WARNING<\/strong> \u00ab\u00a0A non-numeric value encountered\u00a0\u00bb sauf si la cha\u00eene num\u00e9rique de t\u00eate ne contenait que des espaces \u00e0 la fin. Et les diff\u00e9rents cas qui \u00e9mettent actuellement un <strong>E_WARNING<\/strong> seront promus en <code>TypeError<\/code>s.<\/p><\/blockquote>\n<p>Pour un aper\u00e7u plus d\u00e9taill\u00e9 des cha\u00eenes num\u00e9riques en PHP 8, avec des exemples de code, des exceptions et des probl\u00e8mes de r\u00e9trocompatibilit\u00e9, voir le <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a>.<\/p>\n<h3 id=\"match-expression\">Expression de correspondance v2<\/h3>\n<p>La nouvelle expression de correspondance est <code>match<\/code> similaire \u00e0 <code>switch<\/code>, mais avec une s\u00e9mantique plus s\u00fbre et permettant de renvoyer des valeurs.<\/p>\n<p>To understand the difference between the two control structures, consider the following <code>switch<\/code> example from the <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/p>\n<p>Pour comprendre la diff\u00e9rence entre les deux structures de contr\u00f4le, examinez l&rsquo;exemple de <code>switch<\/code> suivant du RFC :<\/p>\n<pre><code class=\"language-php\">switch (1) {\n\tcase 0:\n\t\t$result = 'Foo';\n\t\tbreak;\n\tcase 1:\n\t\t$result = 'Bar';\n\t\tbreak;\n\tcase 2:\n\t\t$result = 'Baz';\n\t\tbreak;\n}\n \necho $result;\n\/\/&gt; Bar<\/code><\/pre>\n<p>Nous pouvons maintenant obtenir le m\u00eame r\u00e9sultat que le code ci-dessus avec l&rsquo;expression de <code>match<\/code> suivante :<\/p>\n<pre><code class=\"language-php\">echo match (1) {\n\t0 =&gt; 'Foo',\n\t1 =&gt; 'Bar',\n\t2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/pre>\n<p>Un grand avantage de l&rsquo;utilisation de la nouvelle expression <code>match<\/code>\u00a0est que, alors que <code>switch<\/code> compare les valeurs de fa\u00e7on l\u00e2che (<code>==<\/code>), ce qui peut conduire \u00e0 des r\u00e9sultats inattendus, avec <code>match<\/code>, la comparaison est un contr\u00f4le d&rsquo;identit\u00e9 (<code>===<\/code>).<\/p>\n<p>L&rsquo;expression de <code>match<\/code> peut \u00e9galement contenir plusieurs expressions s\u00e9par\u00e9es par des virgules, ce qui permet une syntaxe plus concise (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">source<\/a>) :<\/p>\n<pre><code class=\"language-php\">$result = match ($x) {\n\t\/\/ This match arm:\n\t$a, $b, $c =&gt; 5,\n\t\/\/ Is equivalent to these three match arms:\n\t$a =&gt; 5,\n\t$b =&gt; 5,\n\t$c =&gt; 5,\n};<\/code><\/pre>\n<p>Pour d&rsquo;autres exemples et cas d&rsquo;utilisation, voir le <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC Match expression v2<\/a> et la <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">documentation PHP<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Contr\u00f4les de type plus stricts pour les op\u00e9rateurs arithm\u00e9tiques\/bit-syst\u00e8me<\/h3>\n<p>Dans les versions pr\u00e9c\u00e9dentes de PHP, l&rsquo;application d&rsquo;op\u00e9rateurs <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">arithm\u00e9tiques<\/a> et <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitwise<\/a> \u00e0 un tableau, une ressource ou un objet non surcharg\u00e9 \u00e9tait autoris\u00e9e. Quoi qu&rsquo;il en soit, le comportement \u00e9tait parfois incoh\u00e9rent.<\/p>\n<p>Dans <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">ce RFC<\/a>, Nikita Popov montre \u00e0 quel point ce comportement peut \u00eatre d\u00e9raisonnable \u00e0 l&rsquo;aide d&rsquo;un simple exemple :<\/p>\n<pre><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/pre>\n<p>Nikita explique comment l&rsquo;application d&rsquo;un op\u00e9rateur arithm\u00e9tique ou binaire \u00e0 des tableaux, des ressources ou des objets non surcharg\u00e9s a <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">conduit \u00e0 des r\u00e9sultats diff\u00e9rents<\/a> :<\/p>\n<blockquote><p>Op\u00e9rateurs +, -, *, \/, ** :<\/p>\n<ul>\n<li>Lancez l&rsquo;exception d&rsquo;erreur sur l&rsquo;op\u00e9rande de tableau. (Excluant + si les deux op\u00e9randes sont des tableaux).<\/li>\n<li>Convertir silencieusement un op\u00e9rande de ressource en ID de ressource sous forme d&rsquo;entier.<\/li>\n<li>Convertir un op\u00e9rande objet en entier un, tout en lan\u00e7ant un avis.<\/li>\n<\/ul>\n<p>Op\u00e9rateurs %, &lt;&lt;, &gt;&gt;, &#038;, |, ^ :<\/p>\n<ul>\n<li>Convertir silencieusement un op\u00e9rande de tableau en entier z\u00e9ro s&rsquo;il est vide ou en entier un s&rsquo;il n&rsquo;est pas vide.<\/li>\n<li>Convertir silencieusement un op\u00e9rande de ressource en ID de ressource sous forme d&rsquo;entier.<\/li>\n<li>Convertir un op\u00e9rande objet en entier un, tout en lan\u00e7ant un avis.<\/li>\n<\/ul>\n<p>Op\u00e9rateur ~ :<\/p>\n<ul>\n<li>Lancez une exception d&rsquo;erreur pour les op\u00e9randes de tableau, de ressource et d&rsquo;objet.<\/li>\n<\/ul>\n<p>Op\u00e9rateurs ++ et &#8212; :<\/p>\n<ul>\n<li>Ne faites rien en silence si l&rsquo;op\u00e9rande est un tableau, une ressource ou un objet.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Avec PHP 8, les choses changent et le comportement est le m\u00eame pour tous les op\u00e9rateurs arithm\u00e9tiques et binaires :<\/p>\n<p><strong>Lancez une exception <code>TypeError<\/code> pour les op\u00e9randes de tableau, de ressource et d&rsquo;objet.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Nouvelles fonctions PHP<\/h2>\n<p>PHP 8 apporte plusieurs nouvelles fonctions au langage :<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"-1\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Avant PHP 8, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> et <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> \u00e9taient les options typiques pour les <a href=\"https:\/\/kinsta.com\/fr\/blog\/engager-developpeur-wordpress\/\">d\u00e9veloppeurs qui cherchaient<\/a> un needle dans une cha\u00eene donn\u00e9e. Le probl\u00e8me est que ces deux fonctions ne sont pas consid\u00e9r\u00e9es comme tr\u00e8s intuitives et que leur utilisation peut \u00eatre d\u00e9routante pour les nouveaux d\u00e9veloppeurs PHP. Voir l&rsquo;exemple suivant :<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Dans l&rsquo;exemple ci-dessus, nous avons utilis\u00e9 l&rsquo;op\u00e9rateur de comparaison <code>!==<\/code>, qui v\u00e9rifie \u00e9galement si deux valeurs sont du m\u00eame type. Cela nous \u00e9vite d&rsquo;obtenir une erreur <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">si la position de needle est 0<\/a> :<\/p>\n<blockquote><p>\u00ab\u00a0Cette fonction peut renvoyer le bool\u00e9en <strong>FALSE<\/strong>, mais peut \u00e9galement renvoyer une valeur non bool\u00e9enne qui \u00e9value \u00e0 <strong>FALSE<\/strong>. [&#8230;] Utilisez l&rsquo;op\u00e9rateur === pour tester la valeur de retour de cette fonction.\u00a0\u00bb<\/p><\/blockquote>\n<p>En outre, plusieurs frameworks fournissent des fonctions d&rsquo;aide pour rechercher une valeur \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une cha\u00eene donn\u00e9e (voir la <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">documentation de Laravel Helpers<\/a> \u00e0 titre d&rsquo;exemple).<\/p>\n<p>Maintenant, <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">cette RFC<\/a> propose l&rsquo;introduction d&rsquo;une nouvelle fonction permettant de rechercher \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une cha\u00eene de caract\u00e8res : <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Son utilisation est assez simple. <code>str_contains<\/code> v\u00e9rifie si <code>$needle<\/code> est trouv\u00e9 dans <code>$haystack<\/code> et renvoie <code>true<\/code> ou <code>false<\/code> en cons\u00e9quence.<\/p>\n<p>Ainsi, gr\u00e2ce \u00e0 <code>str_contains<\/code>, nous pouvons \u00e9crire le code suivant :<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Ce qui est plus lisible et moins sujet \u00e0 des erreurs (voir ce code en action <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">ici<\/a>).<\/p>\n<p>Au moment de la r\u00e9daction du pr\u00e9sent document, <code>str_contains<\/code> est sensible \u00e0 la casse, mais cela pourrait changer \u00e0 l&rsquo;avenir.<\/p>\n<p>La proposition <code>str_contains<\/code> a \u00e9t\u00e9 adopt\u00e9e par 43 voix contre 9.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() et str_ends_with()<\/h3>\n<p>En plus de la fonction <code>str_contains<\/code>, deux nouvelles fonctions permettent de rechercher un needle \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une cha\u00eene donn\u00e9e : <code>str_starts_with<\/code> et <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Ces nouvelles fonctions<\/a> v\u00e9rifient si une cha\u00eene donn\u00e9e commence ou se termine par une autre cha\u00eene :<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Les deux fonctions renvoient <code>false<\/code> si <code>$needle<\/code> est plus long que <code>$haystack<\/code>.<\/p>\n<p>Selon Will Hudgins, l&rsquo;auteur de cette RFC,<\/p>\n<blockquote><p>\u00ab\u00a0Les fonctionnalit\u00e9s <code>str_starts_with<\/code> et <code>str_ends_with<\/code> sont tellement n\u00e9cessaires que de nombreux <a href=\"https:\/\/kinsta.com\/fr\/blog\/frameworks-php\/\">frameworks PHP majeurs<\/a> les prennent en charge, notamment <a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony,<\/a><a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\"> Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP<\/a> et <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>\u00ab\u00a0.<\/p><\/blockquote>\n<p>Gr\u00e2ce \u00e0 eux, nous avons pu \u00e9viter d&rsquo;utiliser des fonctions sous-optimales et moins intuitives comme <code>substr<\/code>, <code>strpos<\/code>. Ces deux fonctions sont sensibles \u00e0 la casse :<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Vous pouvez voir ce code en action <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">ici<\/a>.<\/p>\n<p>Cette RFC a \u00e9t\u00e9 approuv\u00e9 par 51 voix contre 4.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> est <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">une nouvelle fonction PHP<\/a> qui renvoie le type d&rsquo;une variable. La nouvelle fonction fonctionne de mani\u00e8re assez similaire \u00e0 la <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\">fonction <code>gettype<\/code><\/a>, mais <code>get_debug_type<\/code> retourne les noms de type natifs et r\u00e9sout les noms de classe.<\/p>\n<p>C&rsquo;est une bonne am\u00e9lioration pour le language, car <code>gettype()<\/code> n\u2019est pas utile pour la v\u00e9rification de type.<\/p>\n<p>La RFC fournit deux exemples utiles pour mieux comprendre la diff\u00e9rence entre la nouvelle fonction <code>get_debug_type()<\/code> et <code>gettype()<\/code>. Le premier exemple montre <code>gettype<\/code> en action :<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Avec PHP 8, nous pourrions utiliser <code>get_debug_type<\/code> \u00e0 la place :<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>Le tableau suivant affiche les valeurs de retour de <code>get_debug_type<\/code> et <code>gettype<\/code> :<\/p>\n<table>\n<thead>\n<tr>\n<th>Valeur<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>\u00ab\u00a0WordPress\u00a0\u00bb<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>Une classe qui s&rsquo;appelle \u00ab\u00a0Foo\\Bar\u00a0\u00bb<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>Une classe anonyme<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">RFCs suppl\u00e9mentaires<\/h2>\n<p>Voici une liste succincte des am\u00e9liorations suppl\u00e9mentaires approuv\u00e9es pour le PHP 8 :<\/p>\n<ol>\n<li><strong>Interface Stringable :<\/strong> <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">cette RFC<\/a> introduit une Interface Stringable qui est automatiquement ajout\u00e9e aux classes impl\u00e9mentant la <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\">m\u00e9thode <code>__to String()<\/code><\/a>. Le but principal est ici d&rsquo;utiliser le type d&rsquo;union <code>string|Stringable<\/code>.<\/li>\n<li><strong>Nouvelles API DOM Living Standard en ext\/dom :<\/strong> <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">cette RFC<\/a> propose d&rsquo;impl\u00e9menter l&rsquo;actuelle DOM <a href=\"https:\/\/dom.spec.whatwg.org\/\">Living Standard<\/a> \u00e0 l&rsquo;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">extension PHP DOM<\/a> en introduisant de nouvelles interfaces et propri\u00e9t\u00e9s publiques.<\/li>\n<li><strong>Type de retour statique :<\/strong> PHP 8 introduit l&rsquo;utilisation de <code>static<\/code> comme type de retour \u00e0 c\u00f4t\u00e9 des types <code>self<\/code> et <code>parent<\/code>.<\/li>\n<li><strong>Ajustements de la syntaxe des variables :<\/strong> <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">cette RFC<\/a> r\u00e9sout certaines incoh\u00e9rences r\u00e9siduelles dans la syntaxe des variables de PHP.<\/li>\n<\/ol>\n<h2>Benchmarks des performances de PHP 8<\/h2>\n<p>Si vous vous demandez quelle est la vitesse de PHP 8, nous avons la r\u00e9ponse. Nous avons <a href=\"https:\/\/kinsta.com\/fr\/blog\/comparaison-php\/\">compar\u00e9 20 plateformes\/configurations<\/a> PHP sur 7 versions diff\u00e9rentes de PHP (5.6, 7.0, 7.1, 7.2, 7.3 et 8.0).<\/p>\n<p>PHP 8.0 est sorti vainqueur dans la plupart des plateformes qui le prennent en charge, y compris <a href=\"https:\/\/kinsta.com\/fr\/blog\/laravel-vs-wordpress\/\">WordPress et Laravel<\/a>.<\/p>\n<figure id=\"attachment_88757\" aria-describedby=\"caption-attachment-88757\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-88757 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/02\/Kinsta-PHP-Benchmarks-2021-Compilation.png\" alt=\"Compilation des benchmarks PHP des meilleures plateformes\" width=\"1100\" height=\"799\"><figcaption id=\"caption-attachment-88757\" class=\"wp-caption-text\">Compilation des benchmarks PHP des meilleures plateformes<\/figcaption><\/figure>\n<p>Par exemple, WordPress sur PHP 8.0 peut g\u00e9rer <strong>18,4 %<\/strong> de requ\u00eates suppl\u00e9mentaires par seconde par rapport \u00e0 PHP 7.4. De m\u00eame, Laravel sur PHP 8.0 peut utiliser <strong>8,5 %<\/strong> de requ\u00eates par seconde en plus que PHP 7.3.<\/p>\n<p>Si votre site web ou votre application est enti\u00e8rement compatible avec PHP 8.0, vous devriez planifier la <a href=\"https:\/\/kinsta.com\/fr\/changelog\/php-8\/\">mise \u00e0 jour de l&rsquo;environnement de votre serveur vers PHP 8.0<\/a> d\u00e8s que possible. Vous (et vos utilisateurs) appr\u00e9cierez certainement ses avantages en termes de performances. Cependant, veuillez tester votre site de mani\u00e8re approfondie avant de proc\u00e9der \u00e0 la mise \u00e0 jour.<\/p>\n<p>Vous pouvez lire notre <a href=\"https:\/\/kinsta.com\/fr\/blog\/comparaison-php\/\">article sur les benchmarks PHP<\/a> pour plus d&rsquo;informations, comme des donn\u00e9es d\u00e9taill\u00e9es sur les performances, des aper\u00e7us et de jolis graphiques !<\/p>\n\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Quelle aventure ! Dans ce billet, nous avons couvert les optimisations et les fonctionnalit\u00e9s les plus int\u00e9ressantes de PHP 8. La plus attendue est s\u00fbrement le compilateur Just in Time, mais il y a tellement plus avec PHP 8.<\/p>\n<p>N&rsquo;oubliez pas d&rsquo;ajouter ce billet de blog \u00e0 vos favoris pour votre future r\u00e9f\u00e9rence. \ud83e\udd13<\/p>\n<p>C&rsquo;est maintenant votre tour : \u00eates-vous pr\u00eat \u00e0 tester les nouvelles fonctionnalit\u00e9s de PHP ? Laquelle est votre pr\u00e9f\u00e9r\u00e9e ? \u00c9crivez-nous dans la section \u00ab\u00a0Commentaires\u00a0\u00bb ci-dessous.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 a \u00e9t\u00e9 officiellement mis \u00e0 la disposition du public le 26 novembre 2020 ! Cette nouvelle mise \u00e0 jour majeure apporte tout un tas &#8230;<\/p>\n","protected":false},"author":36,"featured_media":39117,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[31,47],"topic":[1000],"class_list":["post-39112","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-mises-a-jour-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)<\/title>\n<meta name=\"description\" content=\"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l&#039;affichons !\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l&#039;affichons !\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-27T09:26:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-15T13:26:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l&#039;affichons !\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"32 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)\",\"datePublished\":\"2020-05-27T09:26:40+00:00\",\"dateModified\":\"2023-09-15T13:26:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\"},\"wordCount\":6768,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"D\u00e9veloppement WordPress\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\",\"name\":\"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\",\"datePublished\":\"2020-05-27T09:26:40+00:00\",\"dateModified\":\"2023-09-15T13:26:16+00:00\",\"description\":\"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l'affichons !\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg\",\"width\":1024,\"height\":512,\"caption\":\"Quoi de neuf dans le PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mises \u00e0 jour PHP\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/mises-a-jour-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)","description":"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l'affichons !","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/fr\/blog\/php-8\/","og_locale":"fr_FR","og_type":"article","og_title":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)","og_description":"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l'affichons !","og_url":"https:\/\/kinsta.com\/fr\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2020-05-27T09:26:40+00:00","article_modified_time":"2023-09-15T13:26:16+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l'affichons !","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"32 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)","datePublished":"2020-05-27T09:26:40+00:00","dateModified":"2023-09-15T13:26:16+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/"},"wordCount":6768,"commentCount":1,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","keywords":["php","webdev"],"articleSection":["D\u00e9veloppement WordPress"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/","url":"https:\/\/kinsta.com\/fr\/blog\/php-8\/","name":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","datePublished":"2020-05-27T09:26:40+00:00","dateModified":"2023-09-15T13:26:16+00:00","description":"PHP 8 a \u00e9t\u00e9 officiellement publi\u00e9 le 26 novembre 2020 ! Cette mise \u00e0 jour majeure apporte de nombreuses optimisations et de puissantes fonctionnalit\u00e9s. Nous vous l'affichons !","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2020\/05\/neuf-php8-fr.jpg","width":1024,"height":512,"caption":"Quoi de neuf dans le PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Mises \u00e0 jour PHP","item":"https:\/\/kinsta.com\/fr\/sujets\/mises-a-jour-php\/"},{"@type":"ListItem","position":3,"name":"Quoi de neuf dans PHP 8 (fonctionnalit\u00e9s, am\u00e9liorations et compilation JIT)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/39112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=39112"}],"version-history":[{"count":17,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/39112\/revisions"}],"predecessor-version":[{"id":72888,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/39112\/revisions\/72888"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/translations\/se"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/39112\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/39117"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=39112"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=39112"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=39112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}