{"id":35889,"date":"2020-05-28T23:10:47","date_gmt":"2020-05-29T06:10:47","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-09-21T09:26:48","modified_gmt":"2023-09-21T09:26:48","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/se\/blog\/php-8\/","title":{"rendered":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)"},"content":{"rendered":"<p>PHP 8 sl\u00e4pptes officiellt f\u00f6r allm\u00e4n tillg\u00e4nglighet den 26 november 2020!<\/p>\n<p>Den h\u00e4r nya stora uppdateringen l\u00e4gger till m\u00e5nga optimeringar och ett flertal kraftfulla funktioner i spr\u00e5ket. Vi \u00e4r glada \u00f6ver att kunna guida dig igenom de mest intressanta \u00e4ndringarna som g\u00f6r att vi kan skriva b\u00e4ttre kod och bygga mer robusta applikationer.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-84636 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8.0 Till\u00e4gg till tillk\u00e4nnagivande\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Till\u00e4gg till tillk\u00e4nnagivande<\/a><\/figcaption><\/figure>\n<p>\u00c4r du redo? D\u00e5 k\u00f6r vi ig\u00e5ng!<\/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 (Just in Time-kompilator)<\/h2>\n<p>Den mest hyllade funktionen som kommer med PHP 8 \u00e4r <strong>Just-In-time (JIT)-kompilatorn<\/strong>. Vad handlar JIT om?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\" target=\"_blank\" rel=\"noopener noreferrer\">RFC-f\u00f6rslaget<\/a> beskriver JIT enligt f\u00f6ljande:<\/p>\n<blockquote><p>&#8221;PHP JIT implementeras som en n\u00e4stan oberoende del av OPcache. Det kan vara aktiverat\/inaktiverat vid PHPs kompileringstid och vid driftstid. N\u00e4r det \u00e4r aktiverat lagras inbyggd kod f\u00f6r PHP-filer i en ytterligare region i OPcachens delade minne och op_array\u2192opcodes[].handler sparar visare till ing\u00e5ngspunkterna f\u00f6r JIT-koden.\u201d<\/p><\/blockquote>\n<p>S\u00e5, hur kom vi till JIT och vad \u00e4r skillnaden mellan JIT vs OPcache?<\/p>\n<p>F\u00f6r att b\u00e4ttre f\u00f6rst\u00e5 vad JIT betyder f\u00f6r PHP, l\u00e5t oss ta en snabb titt p\u00e5 hur <a href=\"https:\/\/kinsta.com\/se\/blog\/vad-ar-php\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP<\/a> exekverar fr\u00e5n k\u00e4llkoden till slutresultatet.<\/p>\n<p>PHP-exekveringen \u00e4r en 4-stegsprocess:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenisering<\/strong>: f\u00f6rst l\u00e4ser tolken PHP-koden och bygger en upps\u00e4ttning tokens.<\/li>\n<li><strong>Parsning<\/strong>: tolken kontrollerar om skriptet matchar syntaxreglerna och anv\u00e4nder tokens f\u00f6r att bygga ett <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\" target=\"_blank\" rel=\"noopener noreferrer\">abstrakt syntaxtr\u00e4d<\/a> (AST), vilket \u00e4r <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\" target=\"_blank\" rel=\"noopener noreferrer\">en hierarkisk representation av k\u00e4llkodens struktur<\/a>.<\/li>\n<li><strong>Kompilering<\/strong>: tolken g\u00e5r igenom tr\u00e4det och \u00f6vers\u00e4tter AST-noder till Zend-opkoder p\u00e5 l\u00e5g niv\u00e5, vilka \u00e4r numeriska identifierare som avg\u00f6r vilken typ av <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\" target=\"_blank\" rel=\"noopener noreferrer\">instruktion som utf\u00f6rs av Zend VM<\/a>.<\/li>\n<li><strong>Tolkning<\/strong>: Opkoder tolkas och k\u00f6rs p\u00e5 Zend VM.<\/li>\n<\/ul>\n<p>F\u00f6ljande bild visar en visuell representation av den grundl\u00e4ggande PHP-exekveringsprocessen.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-exekvering.png\" alt=\"Grundl\u00e4ggande PHP-exekveringsprocess\" width=\"1100\" height=\"1460\"><figcaption class=\"wp-caption-text\">Grundl\u00e4ggande PHP-exekveringsprocess<\/figcaption><\/figure>\n<p>S\u00e5, hur g\u00f6r OPcache PHP snabbare? Och vad f\u00f6r\u00e4ndras i exekveringsprocessen med JIT?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>OPcache-till\u00e4gget<\/h3>\n<p>PHP \u00e4r ett tolkningsspr\u00e5k. Detta inneb\u00e4r att n\u00e4r ett PHP-skript k\u00f6rs kommer tolken parsa, kompilera, och exekvera koden om och om igen f\u00f6r varje beg\u00e4ran. Detta kan leda till att det <a href=\"https:\/\/phptherightway.com\/#opcode_cache\" target=\"_blank\" rel=\"noopener noreferrer\">sl\u00f6sas CPU-resurser<\/a> och tar extra l\u00e5ng tid.<\/p>\n<p>Det \u00e4r h\u00e4r <a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\" target=\"_blank\" rel=\"noopener noreferrer\">OPcache-till\u00e4gget<\/a> kommer in i bilden.<\/p>\n<blockquote><p>&#8221;OPcache f\u00f6rb\u00e4ttrar PHP-prestanda genom att lagra f\u00f6rkompilerade skript-bytekod i ett delat minne, vilket tar bort behovet av att PHP laddar och parsar skript f\u00f6r varje beg\u00e4ran.\u201d<\/p><\/blockquote>\n<p>Med OPcache aktiverat g\u00e5r PHP-tolken igenom 4-stegsprocessen som n\u00e4mns ovan endast f\u00f6rsta g\u00e5ngen skriptet k\u00f6rs. Eftersom PHP-bytekoder lagras i ett delat minne \u00e4r de omedelbart tillg\u00e4ngliga som mellanliggande representation p\u00e5 l\u00e5g niv\u00e5, och kan exekveras p\u00e5 Zend VM direkt.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-exekvering-2.png\" alt=\"PHP-exekveringsprocess med OPcache aktiverat\" width=\"1100\" height=\"1560\"><figcaption class=\"wp-caption-text\">PHP-exekveringsprocess med OPcache aktiverat<\/figcaption><\/figure>\n<p>Fr\u00e5n och med PHP 5.5 \u00e4r Zend OPcache-till\u00e4gget tillg\u00e4ngligt som standard och du kan kontrollera om du har det korrekt konfigurerat genom att helt enkelt <a href=\"https:\/\/kinsta.com\/se\/blog\/phpinfo\/\" target=\"_blank\" rel=\"noopener noreferrer\">anropa <code>phpinfo()<\/code><\/a> fr\u00e5n ett skript p\u00e5 din server eller kolla din php.ini-fil (se <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\" target=\"_blank\" rel=\"noopener noreferrer\">inst\u00e4llningarna f\u00f6r OPcache-konfiguration<\/a>).<\/p>\n<p>F\u00f6reslagen l\u00e4sning: <a href=\"https:\/\/kinsta.com\/blog\/php-memory-limit\/\">Hur man f\u00f6rb\u00e4ttrar PHP-minnesgr\u00e4nsen i WordPress<\/a>.<\/p>\n<figure style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/zend-opcache.jpg\" alt=\"Zend OPcache-sektionen i en phpinfo-sida\" width=\"1926\" height=\"992\"><figcaption class=\"wp-caption-text\">Zend OPcache-sektionen i en phpinfo-sida<\/figcaption><\/figure>\n<h3>F\u00f6rladdning<\/h3>\n<p>OPcache har nyligen f\u00f6rb\u00e4ttrats med implementeringen av <a href=\"https:\/\/wiki.php.net\/rfc\/preload\" target=\"_blank\" rel=\"noopener noreferrer\">f\u00f6rladdning<\/a>, en ny OPcache-funktion som lades till med <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-4\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP 7.4<\/a>. F\u00f6rladdning ger ett s\u00e4tt att lagra en angiven upps\u00e4ttning skript i OPcacheminnet <em>&#8221;innan n\u00e5gon applikationskod k\u00f6rs&#8221;<\/em>, men det ger inte n\u00e5gon p\u00e5taglig prestandaf\u00f6rb\u00e4ttring f\u00f6r typiska webbaserade applikationer.<\/p>\n<p>Du kan l\u00e4sa mer om f\u00f6rladdning i <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-4\/#preloading\" target=\"_blank\" rel=\"noopener noreferrer\">v\u00e5r introduktion till PHP 7.4<\/a>.<\/p>\n<p>Med JIT tar PHP ett kliv fram\u00e5t.<\/p>\n<h3>JIT \u2013 Just in Time-kompilator<\/h3>\n<p>\u00c4ven om Opkoder \u00e4r mellanliggande representation p\u00e5 l\u00e5g niv\u00e5 m\u00e5ste de fortfarande kompileras till maskinkod. JIT &#8221;introducerar inte n\u00e5gon ytterligare IR-form (Mellanliggande Representation)&#8221;, men anv\u00e4nder <a href=\"https:\/\/luajit.org\/dynasm.html\" target=\"_blank\" rel=\"noopener noreferrer\">DynASM<\/a> (Dynamic Assembler f\u00f6r kodgenereringsmotorer) f\u00f6r att generera maskinkod direkt fr\u00e5n PHP-bytekod.<\/p>\n<p>Kort sagt <strong>\u00f6vers\u00e4tter JIT de heta delarna av den mellanliggande koden till maskinkod<\/strong>. Genom att kringg\u00e5 kompilering skulle det kunna ge betydande f\u00f6rb\u00e4ttringar i prestanda och minnesanv\u00e4ndning.<\/p>\n<p>Zeev Surasky, medf\u00f6rfattare till PHP JIT-f\u00f6rslaget, visar hur mycket snabbare ber\u00e4kningarna skulle vara med JIT:<\/p>\n<p>Men, skulle JIT effektivt f\u00f6rb\u00e4ttra <a href=\"https:\/\/kinsta.com\/blog\/wordpress-performance\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress-prestanda<\/a>?<\/p>\n<h3>JIT f\u00f6r webbapplikationer<\/h3>\n<p>Enligt JIT-f\u00f6rslaget b\u00f6r implementeringen av just in time-kompilatorn f\u00f6rb\u00e4ttra PHP-prestanda. Men skulle vi verkligen uppleva s\u00e5dana f\u00f6rb\u00e4ttringar i verkliga applikationer som WordPress?<\/p>\n<p>De tidiga testerna visar att JIT skulle g\u00f6ra CPU-intensiva arbetsbelastningar betydligt snabbare, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\" target=\"_blank\" rel=\"noopener noreferrer\">men RFC varnar<\/a>:<\/p>\n<blockquote><p>&#8221;&#8230;precis som de tidigare f\u00f6rs\u00f6ken \u2013 det verkar f\u00f6r n\u00e4rvarande inte avsev\u00e4rt f\u00f6rb\u00e4ttra verkliga applikationer som WordPress (med opcache.jit=1235 326 f\u00f6rfr\u00e5gningar\/s vs 315 f\u00f6rfr\u00e5gningar\/s).<\/p>\n<p>Det \u00e4r planerat att tillhandah\u00e5lla ytterligare anstr\u00e4ngningar och f\u00f6rb\u00e4ttra JIT f\u00f6r verkliga applikationer, med hj\u00e4lp av profilering och spekulativa optimeringar.\u201d<\/p><\/blockquote>\n<p>Med JIT aktiverat skulle koden inte k\u00f6ras av Zend VM, utan av sj\u00e4lva CPU:n och detta skulle f\u00f6rb\u00e4ttra ber\u00e4kningshastigheten. Webbapplikationer som <a href=\"https:\/\/kinsta.com\/se\/blog\/vad-ar-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a> \u00e4r ocks\u00e5 beroende av andra faktorer som <a href=\"https:\/\/kinsta.com\/se\/blog\/ttfb\/\" target=\"_blank\" rel=\"noopener noreferrer\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/blog\/wordpress-repair-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">databasoptimering<\/a>, <a href=\"https:\/\/kinsta.com\/learn\/what-is-http2\/\" target=\"_blank\" rel=\"noopener noreferrer\">HTTP-f\u00f6rfr\u00e5gningar<\/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=\"wp-image-84635 size-full\" 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\">Relativt JIT-tillskott till PHP 8-prestandan (Bildk\u00e4lla: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a>)<\/figcaption><\/figure>\n<p>S\u00e5 vi b\u00f6r inte f\u00f6rv\u00e4nta oss en betydande \u00f6kning av PHP-k\u00f6rningshastigheten n\u00e4r det g\u00e4ller WordPress och liknande appar.\u00a0\u00c4nd\u00e5 kan JIT ge flera f\u00f6rdelar f\u00f6r <a href=\"https:\/\/kinsta.com\/se\/blog\/genomsnittliga-lonen-webbutvecklare\/\" target=\"_blank\" rel=\"noopener noreferrer\">utvecklare<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\" target=\"_blank\" rel=\"noopener noreferrer\">Enligt Nikita Popov<\/a>:<\/p>\n<blockquote><p>&#8221;F\u00f6rdelarna med JIT-kompilatorn \u00e4r ungef\u00e4r (och som redan beskrivits i dess RFC):<\/p>\n<ul>\n<li>Betydligt b\u00e4ttre prestanda f\u00f6r numerisk kod.<\/li>\n<li>N\u00e5got b\u00e4ttre prestanda f\u00f6r &#8221;typisk&#8221; PHP-webbapplikationskod.<\/li>\n<li>M\u00f6jligheten att flytta mer kod fr\u00e5n C till PHP, eftersom PHP nu kommer att vara tillr\u00e4ckligt snabbt.\u201d<\/li>\n<\/ul>\n<\/blockquote>\n<p>S\u00e5 medan JIT knappast kommer att medf\u00f6ra stora f\u00f6rb\u00e4ttringar av WordPress-prestanda kommer det att uppgradera PHP till n\u00e4sta niv\u00e5, vilket g\u00f6r det till ett spr\u00e5k som m\u00e5nga funktioner nu kan skrivas direkt i.<\/p>\n<p>Nackdelen skulle dock vara den st\u00f6rre komplexiteten som kan leda till \u00f6kade kostnader f\u00f6r <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-underhall\/\" target=\"_blank\" rel=\"noopener noreferrer\">underh\u00e5ll<\/a>, stabilitet och <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-debug\/\" target=\"_blank\" rel=\"noopener noreferrer\">fels\u00f6kning<\/a>. Enligt Dmitrij Stogov:<\/p>\n<blockquote><p>&#8221;JIT \u00e4r extremt enkelt, men \u00e4nd\u00e5 \u00f6kar det niv\u00e5n p\u00e5 hela PHP-komplexiteten, risken f\u00f6r nya typer av buggar och kostnader f\u00f6r utveckling och underh\u00e5ll.\u201d<\/p><\/blockquote>\n<p>F\u00f6rslaget att inkludera JIT i PHP 8 godk\u00e4ndes med 50 r\u00f6ster mot 2.<\/p>\n\n<h2>PHP 8 f\u00f6rb\u00e4ttringar och nya funktioner<\/h2>\n<p>F\u00f6rutom JIT kan vi f\u00f6rv\u00e4nta oss m\u00e5nga funktioner och f\u00f6rb\u00e4ttringar med PHP 8. F\u00f6ljande lista \u00e4r v\u00e5rt handplockade urval av kommande till\u00e4gg och f\u00f6r\u00e4ndringar som b\u00f6r g\u00f6ra PHP mer tillf\u00f6rlitligt och effektivt.<\/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\">Konstrukt\u00f6rsegenskaps-kampanj<\/h3>\n<p>Som ett resultat av en p\u00e5g\u00e5ende diskussion om att f\u00f6rb\u00e4ttra <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">objekt-ergonomi i PHP<\/a> f\u00f6resl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">Constructor Property Promotion RFC <\/a> en ny och mer kortfattad syntax som f\u00f6renklar egenskaps-deklarationen, vilket g\u00f6r den kortare och mindre r\u00f6rig.<\/p>\n<p>Detta f\u00f6rslag g\u00e4ller endast <strong>fr\u00e4mjade parametrar,<\/strong> dvs. de metodparametrar som f\u00f6reg\u00e5s av <strong>offentliga,<\/strong> <strong>skyddade <\/strong>och <strong>privata<\/strong> synlighetsnyckelord.<\/p>\n<p>F\u00f6r n\u00e4rvarande m\u00e5ste alla egenskaper upprepas flera g\u00e5nger (minst fyra g\u00e5nger) innan vi kan anv\u00e4nda dem med objekt. Begrunda f\u00f6ljande exempel fr\u00e5n RFC:<\/p>\n<pre><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><\/pre>\n<p>Enligt Nikita Popov, RFC-f\u00f6rfattaren, m\u00e5ste vi skriva egenskaps-namnet minst fyra g\u00e5nger p\u00e5 tre olika platser: egenskaps-deklarationen, konstrukt\u00f6rs-parametrarna och egenskaps&#8211;tilldelningen. Denna syntax \u00e4r inte s\u00e4rskilt anv\u00e4ndbar, s\u00e4rskilt i klasser med m\u00e5nga egenskaper och mer beskrivande namn.<\/p>\n<p>Denna RFC f\u00f6resl\u00e5r att konstrukt\u00f6rs och parameterdefinitionen sl\u00e5s samman. S\u00e5 fr\u00e5n och med PHP 8 har vi ett mer anv\u00e4ndbart s\u00e4tt att deklarera parametrar. Koden ovan kan \u00e4ndras enligt nedanst\u00e5ende beskrivning:<\/p>\n<pre><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><\/pre>\n<p>Och det \u00e4r allt. S\u00e5 vi har ett nytt s\u00e4tt att fr\u00e4mja egenskaper som \u00e4r kortare, mer l\u00e4sbara och mindre ben\u00e4gna att bli fel. <a href=\"https:\/\/phpinternals.news\/53\">Enligt Nikita<\/a>:<\/p>\n<blockquote><p>Vi g\u00f6r en enkel syntaktisk f\u00f6rvandling. Men det minskar m\u00e4ngden pannpl\u00e5tskod som du m\u00e5ste skriva f\u00f6r v\u00e4rdeobjekt i synnerhet&#8230;<\/p><\/blockquote>\n<p>Egenskapsdeklarationen omvandlas eftersom vi uttryckligen har deklarerat dessa egenskaper. Vi kan anv\u00e4nda <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">reflektions-API:et<\/a> f\u00f6r att anv\u00e4nda oss av introspekt p\u00e5 egenskapsdefinitioner f\u00f6re k\u00f6rningen (se <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>Reflektion (och andra introspektionsmekanismer) kommer att observera tillst\u00e5ndet efter desugaring. Detta inneb\u00e4r att marknadsf\u00f6rda egenskaper kommer att framtr\u00e4da p\u00e5 samma s\u00e4tt som uttryckligen deklarerade egenskaper, och marknadsf\u00f6rda konstrukt\u00f6rs-argument visas som vanliga konstrukt\u00f6rs-argument.<\/p><\/blockquote>\n<pre><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><\/pre>\n<h4>arv<\/h4>\n<p>Vi har inga begr\u00e4nsningar n\u00e4r det g\u00e4ller att anv\u00e4nda arv i samband med fr\u00e4mjade parametrar. Det finns hursomhelst inget s\u00e4rskilt samband mellan \u00f6verordnade och underordnade klasskonstrukt\u00f6rer. <a href=\"https:\/\/phpinternals.news\/53\">Enligt Nikita<\/a>:<\/p>\n<blockquote><p>Vanligtvis s\u00e4ger vi att metoder alltid m\u00e5ste vara kompatibla med f\u00f6r\u00e4ldra-metoden. [&#8230;] men den h\u00e4r regeln g\u00e4ller inte f\u00f6r konstrukt\u00f6ren. S\u00e5 konstrukt\u00f6ren tillh\u00f6r verkligen en enda klass, och konstrukt\u00f6rer mellan \u00f6verordnad och underordnad klass beh\u00f6ver inte vara kompatibla p\u00e5 n\u00e5got s\u00e4tt.<\/p><\/blockquote>\n<p>H\u00e4r \u00e4r ett exempel:<\/p>\n<pre><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><\/pre>\n<h4>Vad \u00e4r inte till\u00e5tet n\u00e4r det g\u00e4ller fr\u00e4mjade egenskaper<\/h4>\n<p>Fr\u00e4mjade egenskaper \u00e4r till\u00e5tna i icke-abstrakta konstrukt\u00f6rer och egenskaper, men det finns flera begr\u00e4nsningar som \u00e4r v\u00e4rda att n\u00e4mna.<\/p>\n<h5>Abstrakta konstrukt\u00f6rer<\/h5>\n<p>Fr\u00e4mjade egenskaper \u00e4r inte till\u00e5tna i abstrakta klasser och gr\u00e4nssnitt:<\/p>\n<pre><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><\/pre>\n<h5>Ogiltighet<\/h5>\n<p>En av de mest noterbara begr\u00e4nsningarna \u00e4r relaterad till ogiltighet. Vi anv\u00e4nde tidigare en typ som inte uttryckligen var ogiltig. Men med ett ogiltigt standardv\u00e4rde var typen underf\u00f6rst\u00e5tt ogiltig. N\u00e4r det g\u00e4ller egenskapstyper har vi inte detta implicita beteende eftersom fr\u00e4mjade parametrar kr\u00e4ver en egenskapsdeklaration och den ogiltiga typen m\u00e5ste uttryckligen deklareras. Se f\u00f6ljande exempel fr\u00e5n RFC:<\/p>\n<pre><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><\/pre>\n<h5>Anropande typ<\/h5>\n<p>Eftersom anropningsbar inte \u00e4r en <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-4\/#typed-properties\">typ som st\u00f6ds f\u00f6r egenskaper<\/a> f\u00e5r vi inte anv\u00e4nda den anropande typen i fr\u00e4mjade egenskaper:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>Var-nyckelordet \u00e4r inte till\u00e5tet<\/h5>\n<p>Endast ett synlighetsnyckelord kan anv\u00e4ndas med fr\u00e4mjade parametrar, s\u00e5 det \u00e4r inte till\u00e5tet att deklarera konstrukt\u00f6rs-egenskaper med nyckelordet <code>var<\/code> (se f\u00f6ljande exempel fr\u00e5n RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>Inga dupliceringar \u00e4r till\u00e5tna<\/h5>\n<p>Vi kan kombinera fr\u00e4mjade egenskaper och explicita egenskaper i samma klass, men egenskaper kan inte deklareras tv\u00e5 g\u00e5nger:<\/p>\n<pre><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><\/pre>\n<h5>Variadiska parametrar \u00e4r inte till\u00e5tna<\/h5>\n<p>Anledningen h\u00e4r \u00e4r att den deklarerade typen skiljer sig fr\u00e5n den variadiska parametern, som faktiskt \u00e4r en matris:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Ytterligare l\u00e4sning<\/h4>\n<p>F\u00f6r en n\u00e4rmare titt p\u00e5 fr\u00e4mjande av konstrukt\u00f6rs-egenskaper, lyssna p\u00e5 den h\u00e4r <a href=\"https:\/\/phpinternals.news\/53\">intervjun med Nikita Popov<\/a>. F\u00f6r en djupg\u00e5ende \u00f6versikt \u00f6ver objekt-ergonomi i PHP, se <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">det h\u00e4r inl\u00e4gget<\/a> och f\u00f6ljande <a href=\"https:\/\/phpinternals.news\/51\">intervju med Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validering f\u00f6r Abstrakta Trait-metoder<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\" target=\"_blank\" rel=\"noopener noreferrer\">Traits<\/a> definieras som &#8221;en mekanism f\u00f6r kod\u00e5teranv\u00e4ndning i arvsbaserade spr\u00e5k som PHP&#8221;. Vanligtvis anv\u00e4nds de f\u00f6r att deklarera metoder som kan anv\u00e4ndas i flera klasser.<\/p>\n<p>De kan ocks\u00e5 inneh\u00e5lla abstrakta metoder. Dessa metoder deklarerar helt enkelt metodens signatur, men metodens implementering m\u00e5ste ske inom klassen med hj\u00e4lp av detta trait.<\/p>\n<p>Enligt <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\" target=\"_blank\" rel=\"noopener noreferrer\">PHP-manualen<\/a>;<\/p>\n<blockquote><p>&#8221;Traits st\u00f6der anv\u00e4ndningen av abstrakta metoder f\u00f6r att inf\u00f6ra krav p\u00e5 den uppvisande klassen.\u201d<\/p><\/blockquote>\n<p>Detta inneb\u00e4r ocks\u00e5 att metodernas signaturer m\u00e5ste matcha varandra. Med andra ord m\u00e5ste typen och antalet n\u00f6dv\u00e4ndiga argument <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener noreferrer\">vara lika<\/a>.<\/p>\n<p>Hur som helst, <a href=\"https:\/\/externals.io\/message\/108065#108164\" target=\"_blank\" rel=\"noopener noreferrer\">enligt Nikita Popov<\/a>, f\u00f6rfattare till denna RFC, \u00e4r signaturvalidering f\u00f6r n\u00e4rvarande endast verkst\u00e4llt ibland.<\/p>\n<ul>\n<li>Det verkst\u00e4lls inte i de vanligaste fallen, d\u00e5 metodimplementeringen tillhandah\u00e5lls av anv\u00e4ndningsklassen: <a href=\"https:\/\/3v4l.org\/SeVK3\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Det verkst\u00e4lls om implementeringen kommer fr\u00e5n en \u00f6verordnad klass: <a href=\"https:\/\/3v4l.org\/4VCIp\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Det verkst\u00e4lls om implementeringen kommer fr\u00e5n en underordnad klass: <a href=\"https:\/\/3v4l.org\/q7Bq2\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<p>F\u00f6ljande exempel fr\u00e5n Nikita avser det f\u00f6rsta fallet (ej verkst\u00e4lld signatur:<\/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>Med detta sagt f\u00f6resl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> att alltid visa ett allvarligt fel om implementeringsmetoden inte \u00e4r kompatibel med abstract trait-metoden, oavsett ursprung:<\/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>Denna RFC har enh\u00e4lligt godk\u00e4nts.<\/p>\n<h3 id=\"incompatible-method-signatures\">Inkompatibla Metodsignaturer<\/h3>\n<p>I PHP ger \u00e4rvda fel p\u00e5 grund av inkompatibla metodsignaturer antingen ett allvarligt fel eller en varning beroende p\u00e5 vad som orsakar felet.<\/p>\n<p>Om en klass implementerar ett gr\u00e4nssnitt ger inkompatibla metodsignaturer ett allvarligt fel. Enligt <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\" target=\"_blank\" rel=\"noopener noreferrer\">dokumentationen f\u00f6r objektgr\u00e4nssnitt<\/a>:<\/p>\n<blockquote><p>&#8221;Den klass som implementerar gr\u00e4nssnittet m\u00e5ste anv\u00e4nda en metodsignatur som \u00e4r kompatibel med LSP (Liskov Substitutionsprincip). Om du inte g\u00f6r det kommer det att leda till ett allvarligt fel.\u201d<\/p><\/blockquote>\n<p>H\u00e4r \u00e4r ett exempel p\u00e5 ett <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\" target=\"_blank\" rel=\"noopener noreferrer\">arvsfel med ett gr\u00e4nssnitt<\/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>I PHP 7.4 skulle koden ovan ge f\u00f6ljande fel:<\/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>En funktion i en barnklass med en inkompatibel signatur skulle ge en varning. Se f\u00f6ljande kod fr\u00e5n 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>I PHP 7.4 skulle koden ovan helt enkelt ge en varning:<\/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>Nu f\u00f6resl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> att alltid ge ett allvarligt fel f\u00f6r inkompatibla metodsignaturer. Med PHP 8 skulle koden vi s\u00e5g tidigare ovan leda till f\u00f6ljande:<\/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\">Arrayer som b\u00f6rjar med ett negativt Index<\/h3>\n<p>Om en array b\u00f6rjar i PHPH med ett negativt index (<code>start_index &lt; 0<\/code>), startar f\u00f6ljande index fr\u00e5n 0 (mer om detta i\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\" target=\"_blank\" rel=\"noopener noreferrer\"><code>array_fill<\/code>-dokumentationen<\/a>). Titta p\u00e5 f\u00f6ljande exempel:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>I PHP 7.4 skulle resultatet vara f\u00f6ljande:<\/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>Nu f\u00f6resl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">denna RFC<\/a> att \u00e4ndra p\u00e5 detta s\u00e5 att det andra indexet skulle vara <code>start_index + 1<\/code>, beroende p\u00e5 v\u00e4rdet av <code>start_index<\/code>.<\/p>\n<p>I PHP 8 skulle koden ovan resultera i f\u00f6ljande array:<\/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>Med PHP 8 \u00e4ndrar arrayer som b\u00f6rjar med ett negativt index sitt beteende. L\u00e4s mer om bak\u00e5tkompatibiliteter p\u00e5 <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\" target=\"_blank\" rel=\"noopener noreferrer\">RFC-sidan<\/a><u>.<\/u><\/p>\n<h3 id=\"union-types-2-0\">Unionstyper 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\" target=\"_blank\" rel=\"noopener noreferrer\">Unionstyper<\/a> accepterar v\u00e4rden som kan vara av olika slag. F\u00f6r n\u00e4rvarande tillhandah\u00e5ller PHP inte st\u00f6d f\u00f6r unionstyper, med undantag f\u00f6r <code>?Type<\/code>-syntaxen och den speciella <code>iterable<\/code>-typen.<\/p>\n<p>Innan PHP 8 kunde unionstyper endast anges i <a href=\"https:\/\/docs.phpdoc.org\/latest\/guides\/types.html#multiple-types-combined\">phpdoc-anteckningar<\/a>, vilket visas i f\u00f6ljande exempel fr\u00e5n 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><a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Unionstyperna 2.0 RFC<\/a> f\u00f6resl\u00e5r att l\u00e4gga till st\u00f6d f\u00f6r unionstyper i funktionssignaturer, s\u00e5 att vi inte l\u00e4ngre kommer att f\u00f6rlita oss p\u00e5 <a href=\"https:\/\/docs.phpdoc.org\/latest\/guide\/getting-started\/your-first-set-of-documentation.html\">inline-dokumentation<\/a>, utan skulle definiera unionstyper med en <code>T1|T2|...<\/code>-syntax ist\u00e4llet:<\/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>Nikita Popov f\u00f6rklarar i RFC,<\/p>\n<blockquote><p>&#8221;Att st\u00f6dja unionstyper i spr\u00e5ket g\u00f6r det m\u00f6jligt f\u00f6r oss att flytta mer typinformation fr\u00e5n phpdoc till funktionssignaturer, med de vanliga f\u00f6rdelarna som detta medf\u00f6r:<\/p>\n<ul>\n<li>Typer \u00e4r faktiskt verkst\u00e4llda, s\u00e5 misstag kan f\u00e5ngas tidigt.<\/li>\n<li>Eftersom de verkst\u00e4lls \u00e4r typinformation mindre sannolikt att bli f\u00f6r\u00e5ldrad eller missa edge-cases.<\/li>\n<li>Typer kontrolleras genom arv, vilket verkst\u00e4ller Liskovs Substitutionsprincip.<\/li>\n<li>Typer \u00e4r tillg\u00e4ngliga genom Reflection.<\/li>\n<li>Syntaxen \u00e4r mycket mindre standardiserad \u00e4n phpdoc.\u201d<\/li>\n<\/ul>\n<\/blockquote>\n<p>Unionstyper st\u00f6der alla tillg\u00e4ngliga typer, med vissa begr\u00e4nsningar:<\/p>\n<ul>\n<li><code>Void<\/code>-typ kan inte vara en del av en union, eftersom <code>void<\/code> inneb\u00e4r att en funktion <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\" target=\"_blank\" rel=\"noopener noreferrer\">inte returnerar n\u00e5got v\u00e4rde<\/a>.<\/li>\n<li><code>Null<\/code>-typen st\u00f6ds endast i unionstyper, men dess anv\u00e4ndning som en frist\u00e5ende typ \u00e4r inte till\u00e5tet.<\/li>\n<li>Den ogiltiga typ-notationen (<code>?T<\/code>) \u00e4r ocks\u00e5 till\u00e5ten, det vill s\u00e4ga <code>T|null<\/code>, men vi f\u00e5r inte inkludera <code>?T<\/code>-notation i unionstyper (<code>?T1|T2<\/code> \u00e4r inte till\u00e5tet och vi b\u00f6r anv\u00e4nda <code>T1|T2|null<\/code> ist\u00e4llet).<\/li>\n<li>Eftersom m\u00e5nga funktioner (dvs. <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, etc.) inkluderat <code>false<\/code> bland de m\u00f6jliga returtyperna, st\u00f6ds ocks\u00e5 pseudo-typen <code>false<\/code> ocks\u00e5.<\/li>\n<\/ul>\n<p>Du kan l\u00e4sa mer om <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Unionstyper V2<\/a> i dess RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Konsekventa typfel f\u00f6r interna funktioner<\/h3>\n<p>N\u00e4r en parameter av olaglig typ anv\u00e4nds beter sig <a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\" target=\"_blank\" rel=\"noopener noreferrer\">interna<\/a> och <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\" target=\"_blank\" rel=\"noopener noreferrer\">anv\u00e4ndardefinierade<\/a> funktioner annorlunda.<\/p>\n<p>Anv\u00e4ndardefinierade funktioner skapar ett <code>TypeError<\/code>, men interna funktioner beter sig p\u00e5 olika s\u00e4tt, beroende p\u00e5 flera omst\u00e4ndigheter. Hur som helst, det typiska beteendet \u00e4r att visa en varning och returnera <code>null<\/code>. Se f\u00f6ljande exempel i PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Detta skulle resultera i f\u00f6ljande varning:<\/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>Om <code>strict_types<\/code> \u00e4r aktiverat, eller argumentinformationen specificerar typer skulle beteendet vara annorlunda. I s\u00e5dana scenarier uppt\u00e4cks typfelet och resulterar ett <code>TypeError<\/code>.<\/p>\n<p>Denna situation skulle leda till ett antal problem som f\u00f6rklaras v\u00e4l i <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\" target=\"_blank\" rel=\"noopener noreferrer\">problemavsnittet p\u00e5 f\u00f6rslagets RFC-sida<\/a>.<\/p>\n<p>F\u00f6r att ta bort dessa inkonsekvenser <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\" target=\"_blank\" rel=\"noopener noreferrer\">f\u00f6resl\u00e5r denna RFC<\/a> att f\u00e5 den interna parametern som parsar API:er att alltid generera ett <code>ThrowError<\/code> i h\u00e4ndelse av en felmatchad parametertyp.<\/p>\n<p>I PHP 8 ger koden ovan f\u00f6ljande fel:<\/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\">Uttrycket throw<\/h3>\n<p>I PHP \u00e4r <code>throw<\/code> en <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\" target=\"_blank\" rel=\"noopener noreferrer\">sats<\/a>, s\u00e5 det \u00e4r inte m\u00f6jligt att anv\u00e4nda det p\u00e5 platser d\u00e4r endast ett <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\" target=\"_blank\" rel=\"noopener noreferrer\">uttryck<\/a> \u00e4r till\u00e5tet.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\" target=\"_blank\" rel=\"noopener noreferrer\">Denna RFC<\/a> f\u00f6resl\u00e5r att konvertera <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\" target=\"_blank\" rel=\"noopener noreferrer\">satsen <code>throw<\/code><\/a> till ett uttryck s\u00e5 att den kan anv\u00e4ndas i alla sammanhang d\u00e4r uttryck \u00e4r till\u00e5tna. Till exempel <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-4\/#arrow-functions\" target=\"_blank\" rel=\"noopener noreferrer\">arrow-funktioner<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\" target=\"_blank\" rel=\"noopener noreferrer\">null coalesce-operat\u00f6r<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\" target=\"_blank\" rel=\"noopener noreferrer\">ternary och elvis-operat\u00f6rer<\/a> etc.<\/p>\n<p>Se f\u00f6ljande exempel fr\u00e5n 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\">Svaga kartor<\/h3>\n<p>En svag karta \u00e4r en samling data (objekt) d\u00e4r nycklarna \u00e4r svagt refererade, vilket inneb\u00e4r att de inte hindras fr\u00e5n att samlas in som skr\u00e4p.<\/p>\n<p>PHP 7.4 lade till st\u00f6d f\u00f6r <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-4\/#weakreferences\" target=\"_blank\" rel=\"noopener noreferrer\">svaga referenser<\/a> som ett s\u00e4tt att beh\u00e5lla en referens till ett objekt som inte hindrar sj\u00e4lva objektet fr\u00e5n att f\u00f6rst\u00f6ras. Nikita Popov p\u00e5pekar:<\/p>\n<blockquote><p>&#8221;R\u00e5a svaga referenser \u00e4r bara av begr\u00e4nsad anv\u00e4ndbarhet f\u00f6r sig sj\u00e4lva och svaga kartor anv\u00e4nds mycket oftare i praktiken. Det \u00e4r inte m\u00f6jligt att implementera en effektiv svag karta ovanp\u00e5 PHP:s svaga referenser eftersom m\u00f6jligheten att registrera en f\u00f6rst\u00f6relse-callback inte tillhandah\u00e5lls.\u201d<\/p><\/blockquote>\n<p>D\u00e4rf\u00f6r introducerar <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> en <code>WeakMap<\/code>-klass f\u00f6r att skapa objekt som ska anv\u00e4ndas som svaga kartnycklar som kan f\u00f6rst\u00f6ras och tas bort fr\u00e5n den svaga kartan om det inte finns n\u00e5gra ytterligare referenser till nyckelobjektet.<\/p>\n<p>I l\u00e5ngvariga processer skulle detta f\u00f6rhindra minnesl\u00e4ckor och f\u00f6rb\u00e4ttra prestanda.\u00a0Se f\u00f6ljande exempel fr\u00e5n 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>Med PHP 8 skulle koden ovan producera f\u00f6ljande resultat (se <a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\" target=\"_blank\" rel=\"noopener noreferrer\">koden h\u00e4r<\/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>Om du avmarkerar objektet tas nyckeln automatiskt bort fr\u00e5n den svaga kartan:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Nu skulle resultatet bli f\u00f6ljande:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>F\u00f6r en n\u00e4rmare titt p\u00e5 svaga kartor, se f\u00f6rslagets <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a>. F\u00f6rslaget godk\u00e4ndes enh\u00e4lligt.<\/p>\n<h3 id=\"trailing-commas\">Avslutande kommatecken i parameterlistan<\/h3>\n<p>Avslutande kommatecken \u00e4r kommatecken som bifogas listor \u00f6ver objekt i olika sammanhang. PHP 7.2 introducerade <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-2\/#trailing-commas-in-list-syntax\" target=\"_blank\" rel=\"noopener noreferrer\">avslutande kommatecken i listsyntax<\/a>, PHP 7.3 introducerade <a href=\"https:\/\/kinsta.com\/se\/blog\/php-7-3\/#trailing-comma-in-function-calls\" target=\"_blank\" rel=\"noopener noreferrer\">avslutande kommatecken i funktionsanrop<\/a>.<\/p>\n<p>PHP 8 introducerar nu <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\" target=\"_blank\" rel=\"noopener noreferrer\">avslutande kommatecken i parameterlistor<\/a> med funktioner, metoder och st\u00e4ngningar, som visas i f\u00f6ljande exempel:<\/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>Detta f\u00f6rslag antogs med 58 r\u00f6ster mot 1.<\/p>\n<h3 id=\"class-syntax-on-objects\">Till\u00e5t ::class-syntax p\u00e5 objekt<\/h3>\n<p>F\u00f6r att h\u00e4mta namnet p\u00e5 en klass kan vi anv\u00e4nda <code>Foo\\Bar::class<\/code>-syntaxen. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\" target=\"_blank\" rel=\"noopener noreferrer\">Denna RFC<\/a> f\u00f6resl\u00e5r att ut\u00f6ka samma syntax till objekt s\u00e5 att det nu \u00e4r m\u00f6jligt att h\u00e4mta namnet p\u00e5 klassen f\u00f6r ett visst objekt som visas i exemplet nedan:<\/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>Med PHP 8 ger \u00a0<code>$object::class<\/code> samma resultat som <code>get_class($object)<\/code>. Om <code>$object<\/code> inte \u00e4r ett objekt, ger det ett <code>TypeError<\/code>-undantag.<\/p>\n<p>Detta f\u00f6rslag godk\u00e4ndes enh\u00e4lligt.<\/p>\n<h3 id=\"attributes\">Attribut v2<\/h3>\n<p>Attribut, \u00e4ven k\u00e4nd som annoteringar, \u00e4r strukturerade metadata som kan anv\u00e4ndas f\u00f6r att ange egenskaper f\u00f6r objekt, element eller filer.<\/p>\n<p>Fram till PHP 7.4 var doc-kommentarer det enda s\u00e4ttet att l\u00e4gga till metadata i deklarationer av klasser, funktioner etc. Nu introducerar RFC-f\u00f6rslaget <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">Attribut v2<\/a> attribut f\u00f6r PHP som definierar dem som en form av strukturerade, syntaktiska metadata som kan l\u00e4ggas till deklarationer av klasser, egenskaper, funktioner, metoder, parametrar och konstanter.<\/p>\n<p>Attribut l\u00e4ggs till f\u00f6re de deklarationer de h\u00e4nvisar till. Se f\u00f6ljande exempel fr\u00e5n 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>Attribut kan l\u00e4ggas till f\u00f6re eller efter en kommentar till ett dokumentblock:<\/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>Varje deklaration kan ha ett eller flera attribut och varje attribut kan ha ett eller flera associerade v\u00e4rden:<\/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>Se <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" target=\"_blank\" rel=\"noopener noreferrer\">RFC-sidan<\/a> f\u00f6r en djupare \u00f6versikt \u00f6ver PHP-attribut, anv\u00e4ndning, och alternativ syntax.\u00a0Observera att Attribut v2 f\u00f6r n\u00e4rvarande v\u00e4ntar p\u00e5 implementering.<\/p>\n<h3 id=\"named-arguments\">Namngivna argument<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Namngivna argument<\/a> erbjuder ett nytt s\u00e4tt att skicka argument till en funktion i PHP:<\/p>\n<blockquote><p>Namngivna argument g\u00f6r det m\u00f6jligt att skicka argument till en funktion baserat p\u00e5 parameternamnet i st\u00e4llet f\u00f6r parameterpositionen.<\/p><\/blockquote>\n<p>Vi kan skicka namngivna argument till en funktion genom att helt enkelt l\u00e4gga till parameternamnet f\u00f6re dess v\u00e4rde:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction(name: $value);<\/code><\/span><\/pre>\n<p>Vi till\u00e5ts \u00e4ven att anv\u00e4nda reserverade nyckelord, som visas i exemplet nedan:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction(array: $value);<\/code><\/span><\/pre>\n<p>Men vi f\u00e5r inte passera ett parameternamn dynamiskt. Parametern m\u00e5ste vara en identifierare och <strong>f\u00f6ljande syntax \u00e4r inte till\u00e5ten:<\/strong><\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction($name: $value);<\/code><\/span><\/pre>\n<p>Enligt Nikita Popov, f\u00f6rfattaren till denna RFC, erbjuder namngivna argument flera f\u00f6rdelar.<\/p>\n<p>F\u00f6rst och fr\u00e4mst g\u00f6r namngivna argument att vi kan skriva en mer f\u00f6rst\u00e5elig kod eftersom deras mening \u00e4r sj\u00e4lvdokumenterande. Exemplet nedan fr\u00e5n RFC \u00e4r sj\u00e4lvf\u00f6rklarande:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/span><\/pre>\n<p>Namngivna argument \u00e4r oberoende av ordningen. Detta inneb\u00e4r att vi inte tvingas skicka argument till en funktion i samma ordning som funktionssignaturen:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/span><\/pre>\n<p>Det \u00e4r \u00e4ven m\u00f6jligt att kombinera namngivna argument med positionsargument:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/span><\/pre>\n<p>En annan stor f\u00f6rdel med namngivna argument \u00e4r att de endast till\u00e5ter att vi specificerar de argument som vi vill \u00e4ndra. Vi beh\u00f6ver inte specificera standardargument om vi inte vill skriva \u00f6ver standardv\u00e4rden. F\u00f6ljande exempel fr\u00e5n RFC g\u00f6r detta tydligt:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/span><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Om du \u00e4r en <a href=\"https:\/\/kinsta.com\/blog\/hire-wordpress-developer\/\">WordPress-utvecklare<\/a>, v\u00e4nligen observera att i skrivande stund kan namngivna argument leda till <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-5-6\/#named-parameters\">bak\u00e5tkompatibilitetsproblem<\/a>. Anv\u00e4nd dem inte i produktion utan noggrann testning<\/p>\n<\/aside>\n\n<p>Namngivna argument kan anv\u00e4ndas med PHP-attribut, som visas i f\u00f6ljande exempel fr\u00e5n RFC:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/span><\/pre>\n<p>Det \u00e4r dock inte till\u00e5tet att skicka positionsargument efter namngivna argument. Detta kommer att resultera i ett kompileringsfel. Samma sak h\u00e4nder n\u00e4r du passerar samma parameternamn tv\u00e5 g\u00e5nger.<\/p>\n<p>Namngivna argument \u00e4r praktiska med klassdeklarationer eftersom konstrukt\u00f6rer vanligtvis har m\u00e5nga parametrar, och namngivna argument ger ett mer &#8221;ergonomiskt&#8221; s\u00e4tt att deklarera en klass.<\/p>\n<p>En n\u00e4rmare titt p\u00e5 Namngivna Argument, med begr\u00e4nsningar, bak\u00e5tkompatibiliteter och flera exempel, finns i <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">RFC f\u00f6r Namngivna Argument<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Nullsafe-operat\u00f6r<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Denna RFC<\/a> introducerar \u00a0nullsafe-operat\u00f6ren \u00a0<code>$-&gt;<\/code> med fullst\u00e4ndig <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">kortslutningsutv\u00e4rdering<\/a>.<\/p>\n<p>Vid kortslutningsutv\u00e4rdering utv\u00e4rderas den andra operat\u00f6ren endast om den f\u00f6rsta operat\u00f6ren inte utv\u00e4rderas som <code>null<\/code>. Om en operat\u00f6r i en kedja utv\u00e4rderas som <code>null<\/code> stoppas k\u00f6rningen och hela kedjan utv\u00e4rderas som <code>null<\/code>.<\/p>\n<p>Begrunda f\u00f6ljande exempel fr\u00e5n RFC:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/span><\/pre>\n<p>Om <code>$a<\/code> \u00e4r ogiltig kallas inte metod <code>b()<\/code> och <code>$foo<\/code> blir inst\u00e4lld p\u00e5 <code>null<\/code>.<\/p>\n<p>Se <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">RFC f\u00f6r nullsafe-operat\u00f6r<\/a> f\u00f6r ytterligare exempel, undantag och framtida omfattning.<\/p>\n<h3 id=\"string-to-number-comparison\">F\u00f6rnuftigare str\u00e4ng till talj\u00e4mf\u00f6relser<\/h3>\n<p>I tidigare PHP-versioner, n\u00e4r man gjorde en icke-strikt j\u00e4mf\u00f6relse mellan str\u00e4ngar och tal, kastade PHP f\u00f6rst str\u00e4ngen till ett tal och bildade sedan j\u00e4mf\u00f6relsen mellan heltal eller floats. \u00c4ven om det h\u00e4r beteendet \u00e4r ganska anv\u00e4ndbart i flera scenarier kan det ge felaktiga resultat som \u00e4ven kan leda till buggar och \/ eller s\u00e4kerhetsproblem.<\/p>\n<p>Begrunda f\u00f6ljande exempel fr\u00e5n RFC:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/span><\/pre>\n<p>PHP 8 introducerar <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">en f\u00f6rnuftigare str\u00e4n<\/a><a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">g till tal-j\u00e4mf\u00f6relse<\/a>, som syftar till att g\u00f6ra str\u00e4ng till tal-j\u00e4mf\u00f6relser mer rimliga. Med Nikita Popovs ord-<\/p>\n<blockquote><p>Denna RFC avser att ge str\u00e4ng till tal-j\u00e4mf\u00f6relser ett mer rimligt beteende: N\u00e4r du j\u00e4mf\u00f6r med en numerisk str\u00e4ng, anv\u00e4nd en tal-j\u00e4mf\u00f6relse (samma som nu). Annars konverterar du talet till str\u00e4ng och anv\u00e4nder en str\u00e4ngj\u00e4mf\u00f6relse.<\/p><\/blockquote>\n<p>I f\u00f6ljande tabell j\u00e4mf\u00f6rs str\u00e4ng till tal-j\u00e4mf\u00f6relse med tidigare PHP-versioner och PHP 8:<\/p>\n<pre>J\u00e4mf\u00f6relse    | F\u00f6re | efter\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>L\u00e4s mer om de m\u00e5nga konsekvenserna av denna f\u00f6r\u00e4ndring och hur str\u00e4ng till tal-j\u00e4mf\u00f6relser f\u00f6r\u00e4ndras i PHP 8 i den officiella <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC av Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">F\u00f6rnuftigare numeriska str\u00e4ngar<\/h3>\n<p>I PHP \u00e4r str\u00e4ngar som inneh\u00e5ller tal indelade i <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">tre kategorier<\/a>:<\/p>\n<ul>\n<li><strong>Numeriska str\u00e4ngar<\/strong>: str\u00e4ngar som inneh\u00e5ller ett tal som eventuellt f\u00f6reg\u00e5s av blanktecken.<\/li>\n<li><strong>Inledande numerisk str\u00e4ng: <\/strong>str\u00e4ngar vars ursprungliga tecken \u00e4r numeriska str\u00e4ngar och vars avslutande tecken \u00e4r icke-numeriska.<\/li>\n<li><strong>Icke-numerisk str\u00e4ng: <\/strong>str\u00e4ngar som inte ing\u00e5r i n\u00e5gon av de f\u00f6reg\u00e5ende kategorierna.<\/li>\n<\/ul>\n<p>Numeriska str\u00e4ngar och inledande numeriska str\u00e4ngar behandlas olika beroende p\u00e5 vilken \u00e5tg\u00e4rd som utf\u00f6rs, exempelvis:<\/p>\n<ul>\n<li><strong>Explicita str\u00e4ng till tal-konverteringar<\/strong> (dvs. <code>(int)<\/code> och <code>(float)<\/code> typer) konverterar numeriska och inledande numeriska str\u00e4ngnummer. Att uttryckligen konvertera en icke-numerisk str\u00e4ng till ett tal ger v\u00e4rdet 0.<\/li>\n<li><strong>Implicita str\u00e4ng till<\/strong> <strong>tal-konverteringar <\/strong>(dvs. ingen <code>strict_type<\/code>-deklaration) leder till olika resultat f\u00f6r numeriska och icke-numeriska str\u00e4ngar. Icke-numerisk str\u00e4ng till tal-konverteringar skapar en <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> returnerar endast <strong>sant<\/strong> f\u00f6r numeriska str\u00e4ngar.<\/li>\n<\/ul>\n<p>Str\u00e4ngf\u00f6rskjutningar, aritmetiska operationer, \u00f6knings- och minsknings-operationer, j\u00e4mf\u00f6relser mellan str\u00e4ngar och bitvis-operationer leder ocks\u00e5 till olika resultat.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Denna RFC<\/a> f\u00f6resl\u00e5r att du:<\/p>\n<blockquote><p>F\u00f6renar de olika numeriska str\u00e4ngl\u00e4gena till ett enda koncept: Endast numeriska tecken med b\u00e5de inledande och avslutande blanksteg \u00e4r till\u00e5tna. Alla andra typer av str\u00e4ngar \u00e4r icke-numeriska och skapar TypeErrors n\u00e4r de anv\u00e4nds i en numerisk kontext.<\/p>\n<p>Detta inneb\u00e4r att alla str\u00e4ngar som f\u00f6r n\u00e4rvarande avger<strong> E_NOTICE<\/strong> \u00a0&#8221;Ett icke v\u00e4lformat numeriskt v\u00e4rde p\u00e5tr\u00e4ffas&#8221; kommer att omklassificeras till<strong> E_WARNING<\/strong> \u00a0&#8221;Ett icke-numeriskt v\u00e4rde p\u00e5tr\u00e4ffas&#8221; f\u00f6rutom om den inledande numeriska str\u00e4ngen endast inneh\u00f6ll avslutande blanksteg. Och de olika fall som f\u00f6r n\u00e4rvarande avger \u00a0<strong>E_WARNING<\/strong> kommer att fr\u00e4mjas till <code>TypeError<\/code>s.<\/p><\/blockquote>\n<p>En mer djupg\u00e5ende \u00f6versikt \u00f6ver numeriska str\u00e4ngar i PHP 8, med kodexempel, undantag och bak\u00e5tkompatibilitetsproblem, finns i <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a>.<\/p>\n<h3 id=\"match-expression\">Match Expression v2<\/h3>\n<p>Det nya <code>match<\/code> expression \u00e4r ganska likt n\u00e4r det g\u00e4ller <code>switch<\/code> men med s\u00e4krare semantik och till\u00e5ter returnerande av v\u00e4rden.<\/p>\n<p>F\u00f6r att f\u00f6rst\u00e5 skillnaden mellan de tv\u00e5 kontrollstrukturerna b\u00f6r du \u00f6verv\u00e4ga f\u00f6ljande <code>switch<\/code>-exempel fr\u00e5n <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/p>\n<pre><span style=\"color: #ff0000\"><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><\/span><\/pre>\n<p>Vi kan nu f\u00e5 samma resultat som koden ovan med f\u00f6ljande <code>match<\/code> expression:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">echo match (1) {\n\t0 =&gt; 'Foo',\n\t1 =&gt; 'Bar',\n\t2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/span><\/pre>\n<p>En betydande f\u00f6rdel med att anv\u00e4nda det nya <code>match<\/code> expression \u00e4r att \u00e4ven om <code>switch<\/code> j\u00e4mf\u00f6r v\u00e4rden l\u00f6st (<code>==<\/code>) vilket kan leda till ov\u00e4ntade resultat, blir j\u00e4mf\u00f6relsen en identitetskontroll (===).<\/p>\n<p><code>Match<\/code> expression kan \u00e4ven inneh\u00e5lla flera kommaavgr\u00e4nsade uttryck som m\u00f6jligg\u00f6r mer kortfattad syntax (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">k\u00e4lla<\/a>):<\/p>\n<pre><span style=\"color: #ff0000\"><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><\/span><\/pre>\n<p>Ytterligare exempel och anv\u00e4ndningsomr\u00e5den finns i<a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">Match expression v2 RFC<\/a> och <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">PHP-dokumentationen<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Str\u00e4ngare typkontroller f\u00f6r aritmetiska\/bitvis-operat\u00f6rer<\/h3>\n<p>I tidigare PHP-versioner till\u00e4ts det att <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">aritmetiska<\/a> och <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitvisa<\/a> operat\u00f6rer till\u00e4mpades p\u00e5 ett matris-, resurs- eller icke-\u00f6verbelastat objekt. Beteendet var ibland inkonsekvent.<\/p>\n<p>I <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">denna RFC<\/a> visar Nikita Popov hur orimligt det beteendet kan vara med ett enkelt exempel:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/span><\/pre>\n<p>Nikita f\u00f6rklarar hur till\u00e4mpningen av aritmetisk eller bitvis-operat\u00f6rer p\u00e5 matriser, resurser eller icke \u00f6verbelastade objekt <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">ledde till olika resultat<\/a>:<\/p>\n<blockquote><p>Operat\u00f6rer +, -, *, \/, **:<\/p>\n<ul>\n<li>Kasta felundantag p\u00e5 matris-operat\u00f6r. (Exklusive + om b\u00e5da operat\u00f6rerna \u00e4r matriser.)<\/li>\n<li>Konvertera tyst en resurs-operat\u00f6r till resurs-ID:t som heltal.<\/li>\n<li>Konvertera en objekt-operat\u00f6r till heltal ett, samtidigt som du kastar ett meddelande.<\/li>\n<\/ul>\n<p>Operat\u00f6rerna %, &lt;&lt;, &gt;&gt;, &#038;, \u00a0|^<\/p>\n<ul>\n<li>Konvertera tyst en matris-operat\u00f6r till heltal noll om den \u00e4r tom eller heltal ett om den inte \u00e4r tom.<\/li>\n<li>Konvertera tyst en resurs-operat\u00f6r till resurs-ID:t som heltal.<\/li>\n<li>Konvertera en objekt-operat\u00f6r till heltal ett, samtidigt som du kastar ett meddelande.<\/li>\n<\/ul>\n<p>Operat\u00f6r ~:<\/p>\n<ul>\n<li>Kasta ett felundantag f\u00f6r en matris, resurs och objekt-operat\u00f6r.<\/li>\n<\/ul>\n<p>Operat\u00f6rer ++ och &#8211;:<\/p>\n<ul>\n<li>G\u00f6r tyst ingenting om operat\u00f6ren \u00e4r en matris, resurs eller ett objekt.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Med PHP 8 f\u00f6r\u00e4ndras saker och beteendet \u00e4r detsamma f\u00f6r alla aritmetiska och bitvisa operat\u00f6rer:<\/p>\n<p><strong>Generera ett <code>TypeError<\/code>-undantag<\/strong> <strong>f\u00f6r matris-, resurs- och objekt-operat\u00f6rer.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Nya PHP-functioner<\/h2>\n<p>PHP 8 f\u00f6r med sig flera nya funktioner till programmeringsspr\u00e5ket:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Innan PHP 8 var <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener noreferrer\">strstr<\/a> och <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\" target=\"_blank\" rel=\"noopener noreferrer\">strpos<\/a> de typiska alternativen f\u00f6r <a href=\"https:\/\/kinsta.com\/blog\/hire-wordpress-developer\/\">utvecklare<\/a> som beh\u00f6vde s\u00f6ka efter en n\u00e5l i en given str\u00e4ng. Problemet \u00e4r att ingen av funktionerna anses vara s\u00e4rskilt intuitiva och deras anv\u00e4ndning kan vara f\u00f6rvirrande f\u00f6r nya PHP-utvecklare. Se f\u00f6ljande exempel:<\/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>I exemplet ovan anv\u00e4nde vi j\u00e4mf\u00f6relseoperat\u00f6ren <code>!==<\/code>, som ocks\u00e5 kontrollerar om tv\u00e5 v\u00e4rden \u00e4r av samma typ. Detta hindrar oss att f\u00e5 ett fel <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\" target=\"_blank\" rel=\"noopener noreferrer\">om n\u00e5lens position \u00e4r 0<\/a>:<\/p>\n<blockquote><p>&#8221;Den h\u00e4r funktionen kan returnera Boolesk <strong>FALSE<\/strong> men kan ocks\u00e5 returnera ett icke-booleskt v\u00e4rde som evalueras till <strong>FALSE<\/strong> [&#8230;] Anv\u00e4nd ===-operat\u00f6ren f\u00f6r att testa returv\u00e4rdet f\u00f6r denna funktion.\u201d<\/p><\/blockquote>\n<p>Dessutom tillhandah\u00e5ller flera ramverk hj\u00e4lpfunktioner f\u00f6r att s\u00f6ka efter ett v\u00e4rde i en given str\u00e4ng (se <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">Laravel Hj\u00e4lpdokumentation<\/a> som ett exempel).<\/p>\n<p>Nu f\u00f6resl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> inf\u00f6randet av en ny funktion som g\u00f6r det m\u00f6jligt att s\u00f6ka i en str\u00e4ng: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Dess anv\u00e4ndning \u00e4r ganska enkel. <code>str_contains<\/code> kollar om <code>$needle<\/code> finns i <code>$haystack<\/code> och returnerar true eller <code>false<\/code> i enlighet d\u00e4rmed.<\/p>\n<p>S\u00e5 tack vare <code>str_contains<\/code> kan vi skriva f\u00f6ljande kod:<\/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>Vilket \u00e4r mer l\u00e4sbart och mindre felben\u00e4get (se denna kod <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\" target=\"_blank\" rel=\"noopener noreferrer\">h\u00e4r<\/a>).<br \/>\nVid skrivande stund \u00e4r <code>str_contains<\/code> skiftl\u00e4gesk\u00e4nsligt men det kan f\u00f6r\u00e4ndras i framtiden.<\/p>\n<p>F\u00f6rslaget <code>str_contains<\/code> antogs med 43 r\u00f6ster mot 9.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() och str_ends_with()<\/h3>\n<p>F\u00f6rutom <code>str_contains<\/code>-funktionen till\u00e5ter tv\u00e5 nya funktioner dig att s\u00f6ka efter en n\u00e5l i en given str\u00e4ng: <code>str_starts_with<\/code> och <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\" target=\"_blank\" rel=\"noopener noreferrer\">Dessa nya funktioner<\/a> kontrollerar om en viss str\u00e4ng b\u00f6rjar eller slutar med en annan str\u00e4ng:<\/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>B\u00e5da funktionerna returnerar <code>false<\/code> om <code>$needle<\/code> \u00e4r l\u00e4ngre \u00e4n <code>$haystack<\/code>.<\/p>\n<p>Enligt Will Hudgins, f\u00f6rfattaren till denna RFC:<\/p>\n<blockquote><p>&#8221;<code>str_starts_with<\/code> och <code>str_ends_with<\/code>-funktionaliteten \u00e4r s\u00e5 vanliga att m\u00e5nga stora PHP-ramverk har st\u00f6d f\u00f6r det, inklusive <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>, och <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>.\u201d<\/p><\/blockquote>\n<p>Tack vare dem kunde vi nu undvika att anv\u00e4nda suboptimala och mindre intuitiva funktioner som <code>substr<\/code>, <code>strpos<\/code>.\u00a0B\u00e5da funktionerna \u00e4r skiftl\u00e4gesk\u00e4nsliga:<\/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>Du kan se denna kod <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\" target=\"_blank\" rel=\"noopener noreferrer\">h\u00e4r<\/a>.<\/p>\n<p>Denna RFC har godk\u00e4nts med 51 r\u00f6ster mot 4.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> \u00e4r <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\" target=\"_blank\" rel=\"noopener noreferrer\">en ny PHP-funktion<\/a> som returnerar en variabels typ. Den nya funktionen fungerar p\u00e5 ett ganska likartat s\u00e4tt som <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\" target=\"_blank\" rel=\"noopener noreferrer\">gettype-funktionen<\/a>, men <code>get_debug_type<\/code> returnerar inbyggda typnamn och l\u00f6ser klassnamn.<\/p>\n<p>Det \u00e4r en bra f\u00f6rb\u00e4ttring f\u00f6r spr\u00e5ket, eftersom <code>gettype()<\/code> inte \u00e4r anv\u00e4ndbart f\u00f6r typkontroll.<\/p>\n<p>F\u00f6rslaget ger tv\u00e5 anv\u00e4ndbara exempel f\u00f6r att b\u00e4ttre f\u00f6rst\u00e5 skillnaden mellan den nya <code>get_debug_type()<\/code>-funktionen och <code>gettype()<\/code>. Det f\u00f6rsta exemplet visar hur gettype fungerar:<\/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>Med PHP 8 kan vi anv\u00e4nda <code>get_debug_type<\/code> ist\u00e4llet:<\/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>F\u00f6ljande tabell visar returv\u00e4rden f\u00f6r <code>get_debug_type<\/code> och <code>gettype<\/code><\/p>\n<p>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Value<\/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>&#8221;WordPress&#8221;<\/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>En klass med namn &#8221;Foo\\Bar\u201d<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>En anonym klass<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">Ytterligare RFC<\/h2>\n<p>H\u00e4r \u00e4r en snabb lista \u00f6ver ytterligare godk\u00e4nda f\u00f6rb\u00e4ttringar som kommer med PHP 8:<\/p>\n<ol>\n<li><strong>Str\u00e4ngbart gr\u00e4nssnitt<\/strong>: denna <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a> introducerar ett Str\u00e4ngbart gr\u00e4nssnitt som automatiskt l\u00e4ggs till i klasser som implementerar<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\" target=\"_blank\" rel=\"noopener noreferrer\"><code> __to String(<\/code>)-metoden<\/a>. Huvudm\u00e5let h\u00e4r \u00e4r att anv\u00e4nda unionstypen <code>string|Stringable<\/code>.<\/li>\n<li><strong>Nya DOM Living Standard-API:er i ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> f\u00f6resl\u00e5r att implementera den nuvarande <a href=\"https:\/\/dom.spec.whatwg.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">DOM Living Standarden<\/a> till <a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\" target=\"_blank\" rel=\"noopener noreferrer\">PHP DOM-till\u00e4gget<\/a> genom att introducera nya gr\u00e4nssnitt och offentliga egendomar.<\/li>\n<li><strong>Returtypen Static<\/strong>: PHP 8 introducerar anv\u00e4ndningen av <code>static<\/code> som returtyp bredvid <code>self<\/code> och <code>parent<\/code>-typerna.<\/li>\n<li><strong>Variabel Syntax-justeringar<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\" target=\"_blank\" rel=\"noopener noreferrer\">denna RFC<\/a> l\u00f6ser vissa kvarvarande inkonsekvenser i PHP:s variabla syntax.<\/li>\n<\/ol>\n<h2>PHP 8 Prestanda Riktm\u00e4rken<\/h2>\n<p>Om du undrar hur snabbt PHP 8 \u00e4r, har vi svaret. Vi <a href=\"https:\/\/kinsta.com\/se\/blog\/php-riktmarkena\/\">j\u00e4mf\u00f6rde 20 PHP-plattformar\/konfigurationer<\/a> p\u00e5 7 olika PHP-versioner (5.6, 7.0, 7.1, 7.2, 7.3 och 8.0).<\/p>\n<p>PHP 8.0 framtr\u00e4dde som vinnaren p\u00e5 de flesta plattformarna som st\u00f6der det, inklusive WordPress och Laravel.<\/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=\"Sammanst\u00e4llda PHP-riktm\u00e4rken f\u00f6r de b\u00e4sta plattformarna\" width=\"1100\" height=\"799\"><figcaption id=\"caption-attachment-88757\" class=\"wp-caption-text\">Sammanst\u00e4llda PHP-riktm\u00e4rken f\u00f6r de b\u00e4sta plattformarna<\/figcaption><\/figure>\n<p>WordPress p\u00e5 PHP 8.0 kan exempelvis hantera <strong>18.4%<\/strong> fler beg\u00e4randen per sekund \u00e4n PHP 7.4. Laravel p\u00e5 PHP 8.0 kan k\u00f6ra <strong>8.5%<\/strong> fler beg\u00e4randen per sekund \u00e4n om det k\u00f6rs p\u00e5 PHP 7.3.<\/p>\n<p>Om din webbplats eller app \u00e4r helt kompatibel med PHP 8.0 b\u00f6r du planera att <a href=\"https:\/\/kinsta.com\/se\/changelog\/php-8\/\">uppdatera serverns milj\u00f6 till PHP 8.0<\/a> \u00a0s\u00e5 snart som m\u00f6jligt. Du (och dina anv\u00e4ndare) kommer definitivt att uppskatta dess prestandaf\u00f6rdelar. Testa dock din webbplats noggrant innan du uppdaterar.<\/p>\n<p>Du kan l\u00e4sa v\u00e5r <a href=\"https:\/\/kinsta.com\/se\/blog\/php-riktmarkena\/\">PHP riktm\u00e4rken-artikel<\/a> f\u00f6r mer information, som exempelvis detaljerad prestandadata, insikter och vackra grafer!<\/p>\n\n<h2>Sammanfatting<\/h2>\n<p>Snacka om imponerande! I det h\u00e4r inl\u00e4gget t\u00e4ckte vi alla viktiga f\u00f6r\u00e4ndringar och f\u00f6rb\u00e4ttringar som kan f\u00f6rv\u00e4ntas med utg\u00e5van av PHP 8. Den mest efterl\u00e4ngtade \u00e4r garanterat Just in Time-kompilatorn, men det finns s\u00e5 mycket mer p\u00e5 g\u00e5ng med PHP 8.<\/p>\n<p>Se till att bokm\u00e4rka detta blogginl\u00e4gg eftersom vi l\u00e4gger till v\u00e5ra favoriter i listan s\u00e5 snart de \u00e4r godk\u00e4nda. \ud83e\udd13<\/p>\n<p>Nu \u00e4r det din tur: \u00e4r du redo att testa de kommande PHP-funktionerna? Vilken \u00e4r din favorit? Skriv en rad i kommentarf\u00e4ltet nedan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 sl\u00e4pptes officiellt f\u00f6r allm\u00e4n tillg\u00e4nglighet den 26 november 2020! Den h\u00e4r nya stora uppdateringen l\u00e4gger till m\u00e5nga optimeringar och ett flertal kraftfulla funktioner i &#8230;<\/p>\n","protected":false},"author":36,"featured_media":35895,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[38,42],"topic":[804],"class_list":["post-35889","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-php-uppdateringar"],"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>Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)<\/title>\n<meta name=\"description\" content=\"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!\" \/>\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\/se\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/se\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstasweden\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-29T06:10:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-21T09:26:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.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 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)\",\"datePublished\":\"2020-05-29T06:10:47+00:00\",\"dateModified\":\"2023-09-21T09:26:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/\"},\"wordCount\":5608,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"WordPress-utveckling\"],\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/\",\"name\":\"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg\",\"datePublished\":\"2020-05-29T06:10:47+00:00\",\"dateModified\":\"2023-09-21T09:26:48+00:00\",\"description\":\"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg\",\"width\":1024,\"height\":512,\"caption\":\"PHP 8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/se\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP-uppdateringar\",\"item\":\"https:\/\/kinsta.com\/se\/topics\/php-uppdateringar\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/se\/#website\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/se\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/se\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstasweden\/\",\"https:\/\/x.com\/kinsta_se\",\"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\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)","description":"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!","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\/se\/blog\/php-8\/","og_locale":"sv_SE","og_type":"article","og_title":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)","og_description":"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!","og_url":"https:\/\/kinsta.com\/se\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstasweden\/","article_published_time":"2020-05-29T06:10:47+00:00","article_modified_time":"2023-09-21T09:26:48+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!","twitter_image":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_se","twitter_misc":{"Skriven av":"Carlo Daniele","Ber\u00e4knad l\u00e4stid":"27 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)","datePublished":"2020-05-29T06:10:47+00:00","dateModified":"2023-09-21T09:26:48+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/"},"wordCount":5608,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","keywords":["php","webdev"],"articleSection":["WordPress-utveckling"],"inLanguage":"sv-SE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/se\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/","url":"https:\/\/kinsta.com\/se\/blog\/php-8\/","name":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","datePublished":"2020-05-29T06:10:47+00:00","dateModified":"2023-09-21T09:26:48+00:00","description":"PHP 8 v\u00e4ntas att sl\u00e4ppas den 3:e December, 2020. Uppdateringen inneb\u00e4r nya funktioner, avskrivningar och prestanda\u00f6kning. Kolla in vad som \u00e4r nytt med PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/se\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2020\/05\/php-8.jpg","width":1024,"height":512,"caption":"PHP 8"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/se\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/se\/"},{"@type":"ListItem","position":2,"name":"PHP-uppdateringar","item":"https:\/\/kinsta.com\/se\/topics\/php-uppdateringar\/"},{"@type":"ListItem","position":3,"name":"Vad \u00e4r nytt i PHP 8 (Funktioner, f\u00f6rb\u00e4ttringar, och JIT-kompilatorn)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/se\/#website","url":"https:\/\/kinsta.com\/se\/","name":"Kinsta\u00ae","description":"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar","publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/se\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/se\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstasweden\/","https:\/\/x.com\/kinsta_se","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\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/35889","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/comments?post=35889"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/35889\/revisions"}],"predecessor-version":[{"id":39864,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/35889\/revisions\/39864"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/translations\/se"},{"href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/35889\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media\/35895"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media?parent=35889"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/tags?post=35889"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/topic?post=35889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}