{"id":37138,"date":"2020-05-28T02:31:25","date_gmt":"2020-05-28T01:31:25","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-08-24T13:37:51","modified_gmt":"2023-08-24T12:37:51","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/php-8\/","title":{"rendered":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)"},"content":{"rendered":"<p>PHP 8 er officielt frigivet til den generelle tilg\u00e6ngelighed den 26. november 2020!<\/p>\n<p>Denne nye store opdatering bringer en hel r\u00e6kke optimeringer og kraftfulde funktioner til sproget, og vi er glade for at k\u00f8re dig gennem de mest interessante \u00e6ndringer, der giver os mulighed for at skrive bedre kode og opbygge mere kraftfulde 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=\"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\">PHP 8.0 Announcement Addendum<\/a><\/figcaption><\/figure>\n<p>Er du klar? Lad os dykke ned!<\/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 Compiler)<\/h2>\n<p>Den mest anerkendte funktion, der f\u00f8lger med PHP 8, er Just-in-time (JIT)\u00a0 Compiler. Hvad handler JIT om?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">RFC forslaget<\/a> beskriver JIT som f\u00f8lgende:<\/p>\n<blockquote><p>\u201dPHP JIT implementeres som en n\u00e6sten uafh\u00e6ngig del af OPcache. Det kan v\u00e6re aktiveret \/ deaktiveret p\u00e5 PHP compile tid og ved k\u00f8rselstidspunkt. N\u00e5r det er aktiveret, gemmes oprindelig kode for PHP-filer i en yderligere region i den OPCache delte hukommelse og op_array \u2192 opcodes[]. Handler(e) holder pegepunkter til indgangspunkterne for JIT-ed-kode. \u201d<\/p><\/blockquote>\n<p>S\u00e5 hvordan kom vi til JIT, og hvad er forskellen mellem JIT vs OPcache?<\/p>\n<p>For bedre at forst\u00e5, hvad JIT er til PHP, s\u00e5 lad os se hurtigt p\u00e5, hvordan <a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-php\/\">PHP<\/a> k\u00f8rer fra kildekoden til det endelige resultat.<\/p>\n<p>PHP-udf\u00f8relsen er en 4-trins proces:<\/p>\n<ul>\n<li><strong>Lexing\/tokenisering<\/strong>: For det f\u00f8rste l\u00e6ser tolken PHP-koden og bygger et s\u00e6t tokens.<\/li>\n<li><strong>Parsing<\/strong>: Tolken kontrollerer, om scriptet matcher syntaks-reglerne og bruger tokens til at opbygge et <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">Abstract Syntax Tree<\/a> (AST), som er <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">en hierarkisk repr\u00e6sentation af kildekode-strukturen<\/a>.<\/li>\n<li><strong>Kompilering<\/strong>: Tolken gennemg\u00e5r tr\u00e6et og overs\u00e6tter AST-knudepunkter til Zend-opkoder p\u00e5 lavt niveau, som er numeriske identifikatorer, der bestemmer typen af <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">\u200b\u200binstruktion, der udf\u00f8res af Zend VM<\/a>.<\/li>\n<li><strong>Tolkning<\/strong>: Opcodes fortolkes og k\u00f8res p\u00e5 Zend VM.<\/li>\n<\/ul>\n<p>Det f\u00f8lgende billede viser en visuel repr\u00e6sentation af den grundl\u00e6ggende PHP-eksekveringsproces.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-eksekveringsproces-1.png\" alt=\"Grundl\u00e6ggende PHP-eksekveringsproces\" width=\"1100\" height=\"1460\"><figcaption class=\"wp-caption-text\">Grundl\u00e6ggende PHP-eksekveringsproces<\/figcaption><\/figure>\n<p>S\u00e5 hvordan g\u00f8r OPcache PHP hurtigere? Og hvilke \u00e6ndringer i udf\u00f8relsesprocessen 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 extension<\/h3>\n<p>PHP er et tolket sprog. Dette betyder, at n\u00e5r et PHP-script k\u00f8rer, tolker, kompilerer og udf\u00f8rer tolken koden igen og igen p\u00e5 hver anmodning. Dette kan resultere i <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">spild af CPU-ressourcer<\/a> og ekstra tid.<\/p>\n<p>Det er her en <a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">OPcache extension<\/a> kommer i spil:<\/p>\n<blockquote><p>&#8220;OPcache forbedrer PHP-ydeevne ved at gemme forudkompileret script-bytecode i delt hukommelse og dermed fjerne behovet for PHP at indl\u00e6se og analysere scripts p\u00e5 hver anmodning.&#8221;<\/p><\/blockquote>\n<p>Med OPcache aktiveret gennemg\u00e5r PHP-fortolkeren kun 4-trinsprocessen n\u00e6vnt ovenfor, n\u00e5r scriptet k\u00f8rer for f\u00f8rste gang. Da PHP-bytekoder gemmes i delt hukommelse, er de straks tilg\u00e6ngelige som mellemliggende repr\u00e6sentation p\u00e5 lavt niveau og kan udf\u00f8res med det samme p\u00e5 Zend VM.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-eksekvering-2.png\" alt=\"PHP eksekveringsproces med OPcache aktiveret\" width=\"1100\" height=\"1560\"><figcaption class=\"wp-caption-text\">PHP eksekveringsproces med OPcache aktiveret<\/figcaption><\/figure>\n<p>Fra PHP 5.5 er en Zend OPcache extension tilg\u00e6ngelig som standard, og du kan kontrollere, om du har den korrekt konfigureret ved blot at <a href=\"https:\/\/kinsta.com\/dk\/blog\/phpinfo\/\">kalde<\/a> <a href=\"https:\/\/kinsta.com\/dk\/blog\/phpinfo\/\"><code>phpinfo()<\/code><\/a> fra et script p\u00e5 din server eller tjekke din php.ini-fil (se <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">OPcache-konfigurationsindstillinger<\/a>).<\/p>\n<p>Foresl\u00e5et l\u00e6sning: <a href=\"https:\/\/kinsta.com\/blog\/php-memory-limit\/\">How to Improve PHP Memory Limit in WordPress<\/a>.<\/p>\n<figure style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/zend-opcache.jpg\" alt=\"Zend OPcache-sektion p\u00e5 en phpinfo-side\" width=\"1926\" height=\"992\"><figcaption class=\"wp-caption-text\">Zend OPcache-sektion p\u00e5 en phpinfo-side<\/figcaption><\/figure>\n<h3>Preloading<\/h3>\n<p>OPcache er for nylig blevet forbedret med implementeringen af <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">preloading<\/a>, en ny OPcache-funktion tilf\u00f8jet med <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-4\/\">PHP 7.4<\/a>. Forudindl\u00e6sning giver en m\u00e5de at gemme et specificeret s\u00e6t scripts i OPcache-hukommelse \u201cf\u00f8r en applikationskode k\u00f8res\u201d, men det medf\u00f8rer ikke konkrete ydelse-forbedringer for typiske webbaserede applikationer.<\/p>\n<p>Du kan l\u00e6se mere om preloading i vores <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-4\/#preloading\">introduktion til PHP 7.4<\/a>.<\/p>\n<p>Med JIT bev\u00e6ger PHP sig et skridt fremad.<\/p>\n<h3>JIT \u2014 The Just in Time Compiler<\/h3>\n<p>Selv hvis opcodes er i form af mellemliggende repr\u00e6sentation p\u00e5 lavt niveau, skal de stadig samles til maskinkode. JIT &#8220;introducerer ikke nogen yderligere IR (Mellem-repr\u00e6sentation) -formular&#8221;, men bruger <a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Dynamic Assembler til kodegenereringsmotorer) til at generere native code direkte fra PHP-byte-kode.<\/p>\n<p>Kort sagt, <strong>JIT overs\u00e6tter de varme dele af den mellemliggende kode til maskinkode<\/strong>. Ved at omg\u00e5 kompilering kunne det medf\u00f8re betydelige forbedringer i performance og hukommelsesforbrug.<\/p>\n<p>Zeev Surasky, medforfatter til PHP JIT-forslaget, viser, hvor meget beregninger der ville v\u00e6re hurtigere med JIT:<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Men ville JIT effektivt forbedre <a href=\"https:\/\/kinsta.com\/blog\/wordpress-performance\/\">WordPress performance<\/a>?<\/p>\n<h3>JIT for Live Web Apps<\/h3>\n<p>I henhold til JIT RFC, skal implementeringen af \u200b\u200bjust in time compiler forbedre PHP performance. Men ville vi virkelig opleve s\u00e5danne forbedringer i virkelige apps som WordPress?<\/p>\n<p>De tidlige test viser, at JIT ville f\u00e5 CPU-intensive arbejdsbelastninger til at k\u00f8re betydeligt hurtigere, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">men RFC advarer<\/a>:<\/p>\n<blockquote><p>\u201d&#8230; ligesom de foreg\u00e5ende fors\u00f8g &#8211; det ser ud til, at det i \u00f8jeblikket ikke markant forbedrer apps i det virkelige liv som WordPress (med opcache.jit=1235 326 req\/sek vs 315 req\/sek).<\/p>\n<p>Det er planlagt at give en ekstra indsats, forbedre JIT til apps i det virkelige liv, ved hj\u00e6lp af profilering og spekulative optimeringer.\u201d<\/p><\/blockquote>\n<p>N\u00e5r JIT er aktiveret, k\u00f8res koden ikke af Zend VM, men af \u200b\u200bselve CPU&#8217;en, og dette ville forbedre hastigheden i beregningen. Webapps som <a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-wordpress\/\">WordPress<\/a> er ogs\u00e5 afh\u00e6ngige af andre faktorer som <a href=\"https:\/\/kinsta.com\/blog\/ttfb\/\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/dk\/blog\/reparerer-wordpress-database\/\">databaseoptimering<\/a>, <a href=\"https:\/\/kinsta.com\/learn\/what-is-http2\/\">HTTP-anmodninger<\/a> osv.\u00fa<\/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-bidrag til PHP 8-ydeevne (Billedekilde: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a>)<\/figcaption><\/figure>\n<p>S\u00e5 vi skal ikke forvente et markant l\u00f8ft i PHP-udf\u00f8relseshastigheden, n\u00e5r det kommer til WordPress og lignende apps. Ikke desto mindre kunne JIT give flere fordele for <a href=\"https:\/\/kinsta.com\/blog\/web-developer-salary\/\">udviklere<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">If\u00f8lge Nikita Popov<\/a>:<\/p>\n<blockquote><p>\u201dFordelene ved JIT-kompilatoren er nogenlunde (og som allerede beskrevet i RFC):<\/p>\n<ul>\n<li>Betydelig bedre ydelse for numerisk kode.<\/li>\n<li>Lidt bedre ydelse til \u201ctypisk\u201d PHP-webapplikationskode.<\/li>\n<li>Potentialet for at flytte mere kode fra C til PHP, fordi PHP nu vil v\u00e6re tilstr\u00e6kkeligt hurtigt. \u201d<\/li>\n<\/ul>\n<\/blockquote>\n<p>S\u00e5 selvom JIT n\u00e6ppe vil bringe enorme forbedringer af WordPress-ydeevne, vil den opgradere PHP til det n\u00e6ste niveau, hvilket g\u00f8r det til et sprog, hvor mange funktioner nu kunne skrives direkte p\u00e5.<\/p>\n<p>Ulempen er dog den st\u00f8rre kompleksitet, der kan f\u00f8re til stigende omkostninger til <a href=\"https:\/\/kinsta.com\/blog\/wordpress-maintenance\/\">vedligeholdelse<\/a>, stabilitet og <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-fejlretning\/\">debugging<\/a>. If\u00f8lge Dmitry Stogov:<\/p>\n<blockquote><p>\u201dJIT er ekstremt simpelt, men alligevel \u00f8ger det niveauet for hele PHP-kompleksiteten, risikoen for ny slags bugs og omkostningerne til udvikling og vedligeholdelse.\u201d<\/p><\/blockquote>\n<p>Forslaget om at medtage JIT i PHP 8 blev vedtaget med 50 til 2 stemmer.<\/p>\n\n<h2>PHP 8 forbedringer og nye features<\/h2>\n<p>Bortset fra JIT kan vi forvente mange funktioner og forbedringer med PHP 8. Den f\u00f8lgende liste er vores h\u00e5ndplukkede valg af de kommende tilf\u00f8jelser og \u00e6ndringer, der skal g\u00f8re PHP mere p\u00e5lidelig og effektiv.<\/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>Som et resultat af en l\u00f8bende diskussion om, hvordan man forbedrer <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">object ergonomics i PHP<\/a>, foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">Constructor Property Promotion RFC<\/a> en ny og mere kortfattet syntaks, der vil forenkle ejendomserkl\u00e6ringen, hvilket g\u00f8r den kortere og mindre overfl\u00f8dig.<\/p>\n<p>Dette forslag vedr\u00f8rer kun<strong> promoverede parametre<\/strong>, dvs. de metode-parametre, der er pr\u00e6fixet med <strong>offentlige<\/strong>, <strong>beskyttede<\/strong> og <strong>private<\/strong> synlige keywords.<\/p>\n<p>I \u00f8jeblikket skal alle egenskaber gentages flere gange (mindst fire gange), f\u00f8r vi kan bruge dem med objekter. Overvej f\u00f8lgende eksempel fra RFC\u00a0:<\/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>If\u00f8lge Nikita Popov, forfatteren af \u200b\u200bRFC, er vi n\u00f8dt til at skrive ejendomsnavnet mindst fire gange p\u00e5 tre forskellige steder: ejendomserkl\u00e6ringen, konstrukt\u00f8rparametrene og egenskabsopgaven. Denne syntaks er ikke s\u00e6rlig anvendelig, is\u00e6r i klasser med et godt antal egenskaber og mere beskrivende navne.<\/p>\n<p>Denne RFC foresl\u00e5r at flette konstrukt\u00f8ren og parameterdefinitionen. S\u00e5 fra PHP 8 har vi en mere anvendelig m\u00e5de at erkl\u00e6re parametre, og koden set ovenfor kan \u00e6ndres som vist nedenfor:<\/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>Og det er det. S\u00e5 vi har en ny m\u00e5de at markedsf\u00f8re egenskaber, der er kortere, mere l\u00e6selige og mindre tilb\u00f8jelige til fejl. <a href=\"https:\/\/phpinternals.news\/53\">If\u00f8lge Nikita<\/a>:<\/p>\n<blockquote><p>Det er en simpel syntaktisk transformation, som vi laver. Men det reducerer m\u00e6ngden af kedelplade-kode, du er n\u00f8dt til at skrive for v\u00e6rdiobjekter is\u00e6r &#8230;<\/p><\/blockquote>\n<p>Ejendomserkl\u00e6ringen transformeres, da vi eksplicit havde erkl\u00e6ret disse egenskaber, og vi kan bruge <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">Reflection-API<\/a> til at introspektere egenskabsdefinitioner f\u00f8r udf\u00f8relsen (se <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>Reflektion (og andre introspektionsmekanismer) vil observere tilstanden efter desugaring. Dette betyder, at promoverede egenskaber vises p\u00e5 samme m\u00e5de som eksplicit deklarerede egenskaber, og promoverede konstrukt\u00f8rargumenter vises som almindelige konstrukt\u00f8rargumenter.<\/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>Inheritance<\/h4>\n<p>Vi har ingen begr\u00e6nsninger i brugen af \u200b\u200barv sammen med promoverede parametre. Under alle omst\u00e6ndigheder er der ikke et bestemt forhold mellem for\u00e6ldre og child class construction. <a href=\"https:\/\/phpinternals.news\/53\">If\u00f8lge Nikita<\/a>:<\/p>\n<blockquote><p>Normalt siger vi, at metoder altid skal v\u00e6re kompatible med den overordnede metode. [&#8230;] men denne regel g\u00e6lder ikke for konstrukt\u00f8ren. S\u00e5 konstrukt\u00f8ren h\u00f8rer virkelig til en enkelt klasse, og konstrukt\u00f8rer mellem for\u00e6ldre og b\u00f8rn klasse beh\u00f8ver ikke at v\u00e6re kompatible p\u00e5 nogen m\u00e5de.<\/p><\/blockquote>\n<p>Her er et eksempe:<\/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>Hvad der ikke er tilladt med promoverede egenskaber<\/h4>\n<p>Fremme egenskaber er tilladt i ikke-abstrakte konstrukt\u00f8rer og tr\u00e6k, men der er flere begr\u00e6nsninger, der er v\u00e6rd at n\u00e6vne her.<\/p>\n<h5>Abstract Constructors<\/h5>\n<p>Promoverede egenskaber er ikke tilladt i abstrakte klasser og gr\u00e6nseflader:<\/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>Nullability<\/h5>\n<p>En af de mest bem\u00e6rkelsesv\u00e6rdige begr\u00e6nsninger er relateret til nullability. Tidligere, da vi brugte en type, der ikke var eksplicit nullable, men med en nul standardv\u00e6rdi, var typen implicit nullable. Men med egenskabstyper har vi ikke denne implicitte opf\u00f8rsel, fordi promoverede parametre kr\u00e6ver en ejendomserkl\u00e6ring, og den nullable type skal eksplicit erkl\u00e6res. Se f\u00f8lgende eksempel fra 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>Callable Type<\/h5>\n<p>Da konverterbar ikke er en <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-4\/#typed-properties\">underst\u00f8ttet type for egenskaber<\/a>, har vi ikke tilladelse til at bruge den konverterbare type i promoverede egenskaber\u00a0:<\/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>The var Keyword Is Not Allowed<\/h5>\n<p>Kun et synligt keyword kan bruges med promoverede parametre, s\u00e5 det er ikke tilladt at erkl\u00e6re konstrukt\u00f8regenskaber med <code>var<\/code> keyword (se f\u00f8lgende eksempel fra RFC)\u00a0:<\/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>No Duplications Allowed<\/h5>\n<p>Vi kan kombinere promoverede egenskaber og eksplicitte egenskaber i samme klasse, men egenskaber kan ikke erkl\u00e6res to gange\u00a0:<\/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>Variadic Parameters Are Not Allowed<\/h5>\n<p>\u00c5rsagen her er, at den erkl\u00e6rede type adskiller sig fra den variadiske parameter, som faktisk er en matrix\u00a0:<\/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>Yderligere l\u00e6sninger<\/h4>\n<p>For at se n\u00e6rmere p\u00e5 Costructor Property Promotion, lyt til dette i<a href=\"https:\/\/phpinternals.news\/53\">nterview med Nikita Popov<\/a>. For et dybt overblik over object ergonomics i PHP, se <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">dette indl\u00e6g<\/a> og f\u00f8lgende <a href=\"https:\/\/phpinternals.news\/51\">interview med Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validering af abstrakte egenskabsmetoder<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">Traits<\/a> er defineret som &#8220;en mekanisme til genanvendelse af kode p\u00e5 enkelt arvsprog som PHP&#8221;. Typisk bruges de til at erkl\u00e6re metoder, der kan bruges i flere klasser.<\/p>\n<p>En egenskab kan ogs\u00e5 indeholde abstrakte metoder. Disse metoder erkl\u00e6rer simpelthen metodens signatur, men metodens implementering skal ske inden for klassen ved hj\u00e6lp af egenskaben.<\/p>\n<p>I henhold til <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">PHP-manualen<\/a><\/p>\n<blockquote><p>&#8220;Traits underst\u00f8tter brugen af \u200b\u200babstrakte metoder til at stille krav til exhibiting class.&#8221;<\/p><\/blockquote>\n<p>Dette betyder ogs\u00e5, at signaturer til metoderne skal matche. Med andre ord skal typen og antallet af n\u00f8dvendige argumenter <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\">v\u00e6re den samme<\/a>.<\/p>\n<p>I hvert fald h\u00e5ndh\u00e6ves signatur-validering <a href=\"https:\/\/externals.io\/message\/108065#108164\">if\u00f8lge Nikita Popov<\/a>, forfatter af RFC, i \u00f8jeblikket kun spottet:<\/p>\n<ul>\n<li>Det h\u00e5ndh\u00e6ves ikke i det mest almindelige tilf\u00e6lde, hvor metodeimplementeringen leveres af den brugerklasse: <a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Det h\u00e5ndh\u00e6ves, hvis implementeringen kommer fra en overordnet klasse: <a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Det h\u00e5ndh\u00e6ves, hvis implementeringen kommer fra en barneklasse: <a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<li><\/li>\n<\/ul>\n<p>F\u00f8lgende eksempel fra Nikita vedr\u00f8rer den f\u00f8rste sag (ikke h\u00e5ndh\u00e6vet underskrift):<\/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>N\u00e5r det er sagt, foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">denne RFC<\/a> altid at kaste en d\u00f8delig fejl, hvis implementeringsmetoden ikke er kompatibel med den abstrakte egenskabsmetode, uanset dens oprindelse:<\/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>Denne RFC er enstemmig godkendt.<\/p>\n<h3 id=\"incompatible-method-signatures\">Inkompatible metodetegn<\/h3>\n<p>I PHP kaster arvefejl p\u00e5 grund af inkompatible metode-signaturer enten en d\u00f8delig fejl eller en advarsel afh\u00e6ngigt af, hvad der for\u00e5rsager fejlen.<\/p>\n<p>Hvis en klasse implementerer en gr\u00e6nseflade, kaster ukompatible metode-signaturer en d\u00f8delig fejl. I henhold til <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">Object Interfaces documentation<\/a>:<\/p>\n<blockquote><p>\u201dKlassen, der implementerer gr\u00e6nsefladen, skal bruge en metode-signatur, der er kompatibel med LSP (Liskov Substitution Principle). Hvis du ikke g\u00f8r det, vil det medf\u00f8re en d\u00f8delig fejl. \u201d<\/p><\/blockquote>\n<p>Her er et eksempel p\u00e5 <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">en arvefejl med en gr\u00e6nseflade<\/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 ville koden ovenfor kaste f\u00f8lgende fejl:<\/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 child class med en inkompatibel signatur ville kaste en advarsel. Se f\u00f8lgende kode fra 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 ville koden ovenfor blot kaste en advarsel:<\/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 foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">denne RFC<\/a> altid at kaste en d\u00f8delig fejl ved underskrifter med inkompatibel metode. Med PHP 8 ville den kode, vi s\u00e5 tidligere ovenfor, bede om f\u00f8lgende:<\/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\">Arrays der starter med et negativt indeks<\/h3>\n<p>I PHP, hvis en matrix starter med et negativt indeks (<code>start_index &lt;0<\/code>), starter de f\u00f8lgende indekser fra 0 (mere om dette i <code><a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\"><code>array_fill<\/code><\/a><\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\">dokumentation<\/a>). Se p\u00e5 f\u00f8lgende eksempel:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>I PHP 7.4 ville resultatet v\u00e6re f\u00f8lgende:<\/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 foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">denne RFC<\/a> at \u00e6ndre ting, s\u00e5 det andet indeks ville v\u00e6re <code>start_index + 1<\/code>, uanset v\u00e6rdien af <code>start_index<\/code>.<\/p>\n<p>I PHP 8 ville koden ovenfor resultere i f\u00f8lgende 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 \u00e6ndrer arrays der begynder med et negativt indeks deres opf\u00f8rsel. L\u00e6s mere om bagudkompatibiliteter i <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\">Union Types 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Union types<\/a> accepterer v\u00e6rdier, der kan v\u00e6re af forskellige typer. I \u00f8jeblikket yder PHP ikke support til fagtyper med undtagelse af syntaks <code>?Type<\/code> og den specielle <code>iterable<\/code> type.<\/p>\n<p>F\u00f8r PHP 8 kunne union types kun specificeres i phpdoc-kommentarer, som vist i f\u00f8lgende eksempel fra 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>Nu foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">the Union types 2.0 RFC<\/a> at tilf\u00f8je support til union types i funktionssignaturer, s\u00e5 vi ikke vil stole p\u00e5 inline-dokumentation mere, men vil definere union types med en <code>T1 | T2 | ...<\/code> syntaks i stedet:<\/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>Som forklaret af Nikita Popov i RFC,<\/p>\n<blockquote><p>\u201dAt st\u00f8tte fagforeningstyper p\u00e5 sproget giver os mulighed for at flytte flere typeoplysninger fra phpdoc til funktionsunderskrifter med de s\u00e6dvanlige fordele, dette medf\u00f8rer:<\/p>\n<ul>\n<li>Types h\u00e5ndh\u00e6ves faktisk, s\u00e5 fejl kan fanges tidligt.<\/li>\n<li>Fordi de h\u00e5ndh\u00e6ves, er type-oplysninger mindre tilb\u00f8jelige til at blive for\u00e6ldede eller g\u00e5 glip af kanter.<\/li>\n<li>Types kontrolleres under arv, hvilket h\u00e5ndh\u00e6ver Liskov-substitutionsprincippet.<\/li>\n<li>Types er tilg\u00e6ngelige via Reflektion.<\/li>\n<li>Syntaxen er meget mindre kedelplade-y end phpdoc. \u201d<\/li>\n<\/ul>\n<\/blockquote>\n<p>Union types underst\u00f8tter alle tilg\u00e6ngelige typer med nogle begr\u00e6nsninger:<\/p>\n<ul>\n<li><code>void<\/code> type underst\u00f8ttes kun i union types, <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">men det er ikke tilladt at bruge den som en selvst\u00e6ndig type<\/a>.<\/li>\n<li><code>null<\/code> type af \u200b\u200bden nullable type (<code>?T<\/code>) er ogs\u00e5 tilladt, hvilket betyder <code>T|null<\/code>, men vi har ikke tilladelse til at medtage<code>?T<\/code>-notationen i union types (<code>?T1|T2<\/code> er ikke tilladt, og vi b\u00f8r i stedet bruge <code>T1|T2|null<\/code>) .<\/li>\n<li>Da mange funktioner (dvs. <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code> osv.) Inkluderer falsk blandt de mulige returtyper, underst\u00f8ttes den <code>false<\/code> pseudo type ogs\u00e5.<\/li>\n<\/ul>\n<p>Du kan l\u00e6se mere om <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">union types V2<\/a> i RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Konsistente typefejl til interne funktioner<\/h3>\n<p>N\u00e5r du sender en parameter af ulovlig type, opf\u00f8rer de interne og brugerdefinerede funktioner sig forskelligt.<\/p>\n<p>Brugerdefinerede funktioner kaster en <code>TypeError<\/code>, men interne funktioner opf\u00f8rer sig p\u00e5 forskellige m\u00e5der, afh\u00e6ngigt af flere forhold. Alligevel er den typiske opf\u00f8rsel at smide en advarsel og returnere <code>null<\/code>. Se f\u00f8lgende eksempel i PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Dette ville resultere i f\u00f8lgende advarsel:<\/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>Hvis <code>strict_types<\/code> er aktiveret, eller hvis argument oplysninger specificerer typer, vil adf\u00e6rden v\u00e6re anderledes. I s\u00e5danne scenarier registreres typefejlen og resulterer i en <code>TypeError<\/code>.<\/p>\n<p>Denne situation ville f\u00f8re til en r\u00e6kke problemer, der er godt forklaret i <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">RFC&#8217;s problemafdeling<\/a>.<\/p>\n<p>For at fjerne disse uoverensstemmelser <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">foresl\u00e5r denne RFC<\/a> at oprette de interne parameter-parsing-API&#8217;er til altid at generere en <code>ThrowError<\/code> i tilf\u00e6lde af en parametertilpasning.<\/p>\n<p>I PHP 8 kaster koden ovenfor f\u00f8lgende fejl:<\/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\">Throw Expression<\/h3>\n<p>I PHP er <code>throw<\/code> en <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">statement<\/a>, s\u00e5 det er ikke muligt at bruge det p\u00e5 steder, hvor kun en <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">expression<\/a> er tilladt.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Denne RFC<\/a> foresl\u00e5r at konvertere <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\"><code>throw<\/code> statement<\/a>\u00a0 til et udtryk, s\u00e5 det kan bruges i enhver sammenh\u00e6ng, hvor udtryk er tilladt. For eksempel <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-4\/#arrow-functions\">arrow functions<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">null coalesce operator<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">ternary og elvis operators<\/a> osv.<\/p>\n<p>Se f\u00f8lgende eksempler fra 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>Et weak map er en samling af data (objekter), hvor n\u00f8gler refereres svagt, hvilket betyder, at de ikke forhindres i at blive opsamlet skrald.<\/p>\n<p>PHP 7.4 tilf\u00f8jede st\u00f8tte til <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-4\/#weakreferences\">weak references<\/a> som en m\u00e5de at bevare en henvisning til et objekt, der ikke forhindrer selve objektet i at blive \u00f8delagt. Som p\u00e5peget af Nikita Popov,<\/p>\n<blockquote><p>\u201dR\u00e5 svage referencer er kun af begr\u00e6nset brugbarhed i sig selv, og weak maps er meget mere almindeligt anvendt i praksis. Det er ikke muligt at implementere et effektivt weak map oven p\u00e5 PHP-svage referencer, fordi der ikke er mulighed for at registrere et destruction callback. \u201d<\/p><\/blockquote>\n<p>Derfor introducerer <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">denne RFC<\/a> en <code>WeakMap<\/code>-klasse for at oprette objekter, der kan bruges som svage weak map keys, der kan \u00f8del\u00e6gges og fjernes fra weak map, hvis der ikke er yderligere henvisninger til n\u00f8gleobjektet.<\/p>\n<p>I langvarige processer ville dette forhindre hukommelse l\u00e6kager og forbedre ydelsen. Se f\u00f8lgende eksempel fra 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 ville koden ovenfor give f\u00f8lgende resultat (se <a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">koden i action her)<\/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>Hvis du fjerner objektet, fjernes n\u00f8glen automatisk fra weak map:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Nu ville resultatet v\u00e6re f\u00f8lgende:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Se RFC for et n\u00e6rmere kig p\u00e5 weak mapst. Forslaget blev enstemmigt godkendt.<\/p>\n<h3 id=\"trailing-commas\">Trailing commas i parameterliste<\/h3>\n<p>Trailing commas er kommaer knyttet til lister over elementer i forskellige sammenh\u00e6nge. PHP 7.2 introducerede <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">trailing commas i listesyntaks<\/a>, PHP 7.3 introducerede <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-7-3\/#trailing-comma-in-function-calls\">trailing commas i function calls<\/a>.<\/p>\n<p>PHP 8 introducerer nu <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">trailing commas i parameter lists<\/a> med funktioner, metoder og lukninger, som vist i f\u00f8lgende eksempel:<\/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>Dette forslag blev vedtaget med 58 til 1 stemmer.<\/p>\n<h3 id=\"class-syntax-on-objects\">Allow ::class syntax p\u00e5 objekter<\/h3>\n<p>For at hente navnet p\u00e5 en klasse kan vi bruge <code>Foo\\Bar::class<\/code> syntax. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Denne RFC<\/a> foresl\u00e5r at udvide den samme syntaks til objekter, s\u00e5 det nu er muligt at hente navnet p\u00e5 klassen p\u00e5 et givet objekt som vist i eksemplet herunder:<\/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 giver <code>$object:: class<\/code> det samme resultat som <code>get_class ($object)<\/code>. Hvis <code>$object<\/code> ikke er et objekt, kaster det en <code>TypeError<\/code>-undtagelse.<\/p>\n<p>Dette forslag blev enstemmigt godkendt.<\/p>\n<h3 id=\"attributes\">Attributes v2<\/h3>\n<p>Attributes, ogs\u00e5 kendt som annotationer, er en form for strukturerede metadata, der kan bruges til at specificere egenskaber for objekter, elementer eller filer.<\/p>\n<p>Indtil PHP 7.4 var doc-kommentarer den eneste m\u00e5de at tilf\u00f8je metadata til erkl\u00e6ringer om klasser, funktioner osv. Nu introducerer <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">Attributes v2 RFC<\/a> attributes til PHP, der definerer dem som en form for strukturerede, syntaktiske metadata, der kan f\u00f8jes til erkl\u00e6ringerne om klasser, egenskaber, funktioner, metoder, parametre og konstanter.<\/p>\n<p>Attributes tilf\u00f8jes f\u00f8r de erkl\u00e6ringer, de henviser til. Se f\u00f8lgende eksempler fra RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\nclass Foo\n{\n\t&lt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&gt;\n\tpublic $x;\n\n\t&lt;&gt;\n\tpublic function foo(&lt;&gt; $bar) { }\n}\n\n$object = new &lt;&gt; class () { };\n\n&lt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&gt; function () { };\n\n$f3 = &lt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Attributes kan tilf\u00f8jes f\u00f8r eller efter en doc-block kommentar:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\n\/** docblock *\/\n&lt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Hver erkl\u00e6ring kan have en eller flere attributter, og hver attribut kan have en eller flere tilknyttede v\u00e6rdier:<\/p>\n<pre><code class=\"language-php\">&lt;&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\">RFC<\/a> for en dybere oversigt over PHP-attributter, brugssager og alternativ syntaks.<\/p>\n<h3 id=\"named-arguments\">Named Arguments<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named arguments<\/a> giver en ny m\u00e5de at overf\u00f8re argumenter til en funktion i PHP:<\/p>\n<blockquote><p>Named arguments tillader overf\u00f8rsel af argumenter til en funktion baseret p\u00e5 parameternavnet snarere end parameterpositionen.<\/p><\/blockquote>\n<p>Vi kan sende Named Arguments til en funktion ved blot at tilf\u00f8je parameternavnet f\u00f8r dens v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">callFunction(name: $value);<\/code><\/pre>\n<p>Vi har ogs\u00e5 tilladelse til at bruge reserverede n\u00f8gleord som vist i eksemplet nedenfor:<\/p>\n<pre><code class=\"language-php\">callFunction(array: $value);<\/code><\/pre>\n<p>Men vi har ikke lov til at videregive et parameternavn dynamisk. Parameteren skal v\u00e6re en identifikator, og <strong>f\u00f8lgende syntaks er ikke tilladt<\/strong>:<\/p>\n<pre><code class=\"language-php\">callFunction($name: $value);<\/code><\/pre>\n<p>If\u00f8lge Nikita Popov, forfatteren af \u200b\u200bdenne RFC, har named arguments flere fordele.<\/p>\n<p>For det f\u00f8rste vil named arguments hj\u00e6lpe os med at skrive mere forst\u00e5elig kode, fordi deres betydning er selvdokumenterende. Eksemplet nedenfor fra RFC forklarer sig selv:<\/p>\n<pre><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/pre>\n<p>Named arguments er ordens-uafh\u00e6ngige. Dette betyder, at vi ikke er tvunget til at videregive arguments til en funktion i samme r\u00e6kkef\u00f8lge som funktionssignaturen:<\/p>\n<pre><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/pre>\n<p>Det er ogs\u00e5 muligt at kombinere navngivne argumenter med positionelle arguments:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p>En anden stor fordel ved named arguments er, at de kun tillader at specificere de arguments, vi rent faktisk vil \u00e6ndre, og at vi ikke beh\u00f8ver at specificere standardargumenter, hvis vi ikke vil overskrive standardv\u00e6rdier. F\u00f8lgende eksempel fra RFC g\u00f8r det klart:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Hvis du er en <a href=\"https:\/\/kinsta.com\/blog\/hire-wordpress-developer\/\">WordPress-udvikler<\/a>, skal du bem\u00e6rke, at p\u00e5 tidspunktet for denne skrivning kan named arguments f\u00f8re <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-5-6\/#named-parameters\">til problemer med bagudkompatibilitet<\/a>. Brug dem ikke i produktionen uden tankev\u00e6kkende testing.<\/p>\n<\/aside>\n\n<p>Named arguments kan bruges med <a href=\"#attributes\">PHP-attributter<\/a>, som vist i f\u00f8lgende eksempel fra RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/pre>\n<p>Men t sende positional arguments efter named arguments er imidlertid ikke tilladt og vil resultere i en kompilering tidsfejl. Det samme sker, n\u00e5r du sender det samme parameternavn to gange.<\/p>\n<p>Named arguments er is\u00e6r nyttige med class deklarationer, fordi konstrukt\u00f8rer normalt har et stort antal parametre, og navngivne argumenter giver en mere &#8220;ergonomisk&#8221; m\u00e5de at erkl\u00e6re en class p\u00e5.<\/p>\n<p>For en n\u00e6rmere oversigt over named arguments med begr\u00e6nsninger, bagudkompatibiliteter og flere eksempler, se <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named arguments RFC<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Nullsafe Operator<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Denne RFC<\/a> introducerer nullsafe operator <code>$-&gt;<\/code> med <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">short-circuit evaluation<\/a>.<\/p>\n<p>Ved short-circuit evaluation evalueres den anden operat\u00f8r kun, hvis den f\u00f8rste operat\u00f8r ikke evaluerer til <code>null<\/code>. Hvis en operat\u00f8r i en k\u00e6de evaluerer til <code>null<\/code>, stopper udf\u00f8relsen af \u200b\u200bhele k\u00e6den og evalueres til <code>null<\/code>.<\/p>\n<p>Overvej f\u00f8lgende eksempler fra RFC:<\/p>\n<pre><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/pre>\n<p>Hvis <code>$a<\/code> er null, kaldes metode <code>b()<\/code> ikke, og <code>$foo<\/code> er indstillet til <code>null<\/code>.<\/p>\n<p>Se <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">rfc:nullsafe_operator<\/a> for yderligere eksempler, undtagelser og fremtidig r\u00e6kkevidde.<\/p>\n<h3 id=\"string-to-number-comparison\">Saner String to Number Comparisons<\/h3>\n<p>I tidligere PHP-versioner, n\u00e5r der foretages en ikke-streng sammenligning mellem strings og tal, kaster PHP f\u00f8rst string til et tal og udf\u00f8rer derefter sammenligningen mellem heltal eller floats. Selvom denne adf\u00e6rd er ret nyttig i flere scenarier, kan den give forkerte resultater, der ogs\u00e5 kan f\u00f8re til fejl og\/eller sikkerhedsproblemer.<\/p>\n<p>Overvej f\u00f8lgende eksempel fra 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>PHP 8 introducerer <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">Saner string to number comparisons<\/a>, der sigter mod at g\u00f8re string til antal sammenligninger mere rimelige. Med ordene fra Nikita Popov,<\/p>\n<blockquote><p>Denne RFC har til hensigt at give streng til antal sammenligninger en mere rimelig opf\u00f8rsel: N\u00e5r du sammenligner med en numerisk streng, skal du bruge en tallesammenligning (samme som nu). Ellers konverterer du nummeret til streng og bruger en strengesammenligning.<\/p><\/blockquote>\n<p>Den f\u00f8lgende tabel sammenligner strengens opf\u00f8rsel med tidligere sammenligning af numre til PHP og i 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>L\u00e6s mere om de mange implikationer af denne \u00e6ndring, og hvordan streng til tal-sammenligning \u00e6ndres i PHP 8 i den officielle <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC fra Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Saner Numeric Strings<\/h3>\n<p>I PHP falder strenge, der indeholder tal, ind 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>Numeric strings:<\/strong> strings, der indeholder et tal, der eventuelt indledes med mellemrum.<\/li>\n<li><strong>Leading-numeric string:<\/strong> strings, hvis indledende tegn er numeric strings, og efterf\u00f8lgende tegn er ikke-numeriske.<\/li>\n<li><strong>Non-numeric string:<\/strong> strings falder ikke i nogen af \u200b\u200bde foreg\u00e5ende kategorier.<\/li>\n<\/ul>\n<p>Numeric strings og ledende-numeriske strenge behandles forskelligt afh\u00e6ngigt af den udf\u00f8rte operation. For eksempel:<\/p>\n<ul>\n<li><strong>Explicit string to number conversions<\/strong> (i.e. <code>(int)<\/code> og <code>(float)<\/code> type casts) konverterer numeriske og ledende-numeriske strings numre. Eksplicit at konvertere en ikke-numerisk string til et tal producerer 0.<\/li>\n<li><strong>Explicit string to number conversions<\/strong> (dvs. ingen <code>string_type<\/code>-declaration) f\u00f8rer til forskellige resultater for numeriske og ikke-numeriske strenge. Ikke-numerisk string til antal konverteringer kaster en <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> returnerer kun <strong>true<\/strong> for numeriske strenge.<\/li>\n<\/ul>\n<p>Strengforskydninger, aritmetiske operationer, inkrement- og dekrementeringsoperationer, streng-til-streng-sammenligning og bitvise operationer f\u00f8rer ogs\u00e5 til forskellige resultater.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\"><span style=\"font-weight: 400\">Denne RFC<\/span><\/a><span style=\"font-weight: 400\"> foresl\u00e5r at:<\/span><\/p>\n<blockquote><p>Forene de forskellige numeric string modes i et enkelt koncept: Numeriske tegn kun med b\u00e5de ledende og efterf\u00f8lgende hvidt mellemrum tilladt. Enhver anden type stre\u00edng er non-numeric og kaster TypeErrors, n\u00e5r den bruges i en numerisk sammenh\u00e6ng.<\/p>\n<p>Dette betyder, at alle strenge, der i \u00f8jeblikket udsender <strong>E_NOTICE<\/strong> &#8220;En ikke-velformet numerisk v\u00e6rdi, der er st\u00f8dt p\u00e5&#8221;, vil blive klassificeret igen i <strong>E_WARNING<\/strong> &#8220;En ikke-numerisk v\u00e6rdi, der er st\u00f8dt p\u00e5&#8221;, undtagen hvis den ledende-numeriske streng kun indeholdt efterf\u00f8lgende hvidt mellemrum. Og de forskellige sager, der i \u00f8jeblikket udsender en <strong>E_WARNING<\/strong>, promoveres til <code>TypeErrors<\/code>.<\/p><\/blockquote>\n<p>For en dybere oversigt over numeriske strenge i PHP 8 med kodeeksempler, undtagelser og backward compatibility issues, se <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 nye <code>match<\/code> udtryk ligner stort set <code>switch<\/code>, men med sikrere semantik og giver mulighed for at returnere values.<\/p>\n<p>For at forst\u00e5 forskellen mellem de to kontrolstrukturer skal du overveje f\u00f8lgende switcheksempel fra <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/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>Vi kan nu f\u00e5 det samme resultat som koden ovenfor med f\u00f8lgende <code>match<\/code> udtryk:<\/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>En stor fordel ved at bruge det nye <code>match<\/code> udtryk er, at mens <code>switch<\/code> sammenligner v\u00e6rdier l\u00f8st (<code>==<\/code>), der potentielt f\u00f8rer til uventede resultater, med sammenligning er sammenligningen en identitetskontrol (<code>===<\/code>).<\/p>\n<p><code>match<\/code> udtrykket kan ogs\u00e5 indeholde flere kommaseparerede udtryk, der giver mulighed for mere kortfattet syntaks (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">kilde<\/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>For yderligere eksempler og tilf\u00e6lde af brug, se <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">Match expression v2 RFC<\/a> og <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">PHP documentation<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Strengere kontrol af typen for Arithmetic\/Bitwise Operators<\/h3>\n<p>I tidligere versioner af PHP var det tilladt at anvende <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">arithmetic<\/a> og <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitwise<\/a> operators p\u00e5 et array, ressource eller ikke-overbelastet objekt. Under alle omst\u00e6ndigheder var adf\u00e6rden undertiden inkonsekvent.<\/p>\n<p>I <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">denne RFC<\/a> viser Nikita Popov, hvor urimelig den adf\u00e6rd kunne v\u00e6re med et simpelt eksempel:<\/p>\n<pre><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/pre>\n<p>Nikita forklarer, hvordan anvendelse af en aritmetisk eller bitvis operator p\u00e5 arrays, ressourcer eller ikke-overbelastede objekter f\u00f8rte <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">til forskellige resultater<\/a>:<\/p>\n<blockquote><p>Operators +, -, *, \/, **:<\/p>\n<ul>\n<li>Throw Error exception p\u00e5 array operand. (Ekskluderer+ hvis begge operander er array.)<\/li>\n<li>Konverter en resource operand stille til ressource id&#8217;et som et heltal.<\/li>\n<li>Konverter en objektoperand til heltal, mens du kaster en meddelelse.<\/li>\n<\/ul>\n<p>Operators %, &lt;&lt;, &gt;&gt;, &#038;, |, ^:<\/p>\n<ul>\n<li>Konverter en matrixoperand stille til heltal nul, hvis det er tomt eller heltal, hvis det ikke er tomt.<\/li>\n<li>Konverter en resource operand stille til resource id som et heltal.<\/li>\n<li>Konverter en object operand til heltal, mens du kaster en meddelelse.<\/li>\n<\/ul>\n<p>Operator ~:<\/p>\n<ul>\n<li>Throw en TypeError exception for array, resource og object operands.<\/li>\n<\/ul>\n<p>Operators ++ and &#8211;:<\/p>\n<ul>\n<li>G\u00f8r intet, hvis operanden er en matrix, ressource eller et objekt.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Med PHP 8 \u00e6ndres ting, og adf\u00e6rden er den samme for alle aritmetiske og bitvise operat\u00f8rer:<\/p>\n<p><strong>Throw en <code>TypeError<\/code> exception for array, resource og object operands.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Nye PHP-funktioner<\/h2>\n<p>PHP 8 bringer flere nye funktioner til sproget:<\/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>F\u00f8r PHP 8 var <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> og <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> de typiske muligheder for <a href=\"https:\/\/kinsta.com\/blog\/hire-wordpress-developer\/\">udviklere<\/a> at s\u00f8ge efter en n\u00e5l inde i en given streng. Problemet er, begge funktioner betragtes ikke som meget intuitive, og deres brug kan v\u00e6re forvirrende for nye PHP-udviklere. Se f\u00f8lgende eksempel:<\/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 eksemplet ovenfor brugte vi<code>! ==<\/code> sammenligning operat\u00f8ren, som ogs\u00e5 kontrollerer, om to v\u00e6rdier er af samme type. Dette forhindrer os i at f\u00e5 en fejl, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">hvis n\u00e5lens placering er 0<\/a>:<\/p>\n<blockquote><p>\u201dDenne funktion returnerer muligvis Boolean <strong>FALSE<\/strong>, men kan ogs\u00e5 returnere en ikke-boolean v\u00e6rdi, der evalueres til <strong>FALSE<\/strong>. [\u2026] Brug === operatoren til at teste returnerings-v\u00e6rdien for denne funktion\u201d<\/p><\/blockquote>\n<p>Derudover giver flere rammer hj\u00e6lperfunktioner til at s\u00f8ge efter en v\u00e6rdi inde i en given streng (se <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">Laravel Helpers dokumentation<\/a> som et eksempel).<\/p>\n<p>Nu foresl\u00e5r <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">denne RFC <\/a>introduktion af en ny funktion, der g\u00f8r det muligt at s\u00f8ge i en streng: <code>str_concepts<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Dens brug er temmelig ligetil. <code>str_concepts<\/code> kontrollerer om <code>$needle<\/code> findes i <code>$haystack<\/code> og returnerer <code>true<\/code> eller <code>false<\/code> i overensstemmelse hermed.<\/p>\n<p>S\u00e5 takket v\u00e6re <code>str_contains<\/code> kan vi skrive f\u00f8lgende kode:<\/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>Hvilket er mere l\u00e6seligt og mindre tilb\u00f8jeligt til fejl (se denne kode i action <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">her<\/a>).<br \/>\nP\u00e5 dette tidspunkt er <code>str_containes<\/code> store og sm\u00e5 bogstaver, men dette kan \u00e6ndre sig i fremtiden.<\/p>\n<p><code>str_concepts<\/code>-forslaget vedtaget med 43 til 9 stemmer.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() og str_ends_with()<\/h3>\n<p>Foruden <code>str_concepts<\/code>-funktionen tillader to nye funktioner at s\u00f8ge efter en needle inden i en given streng: <code>str_starts_with<\/code> og <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Disse nye funktioner<\/a> kontrollerer, om en given streng starter eller slutter med en anden streng:<\/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>Begge funktioner returnerer <code>false<\/code>, hvis <code>$needle<\/code> er l\u00e6ngere end <code>$haystack<\/code>.<\/p>\n<p>If\u00f8lge Will Hudgins, forfatteren af denne RFC,<\/p>\n<blockquote><p>&#8220;<code>str_starts_with<\/code>&#8211; og <code>str_ends_with<\/code>-funktionaliteten er s\u00e5 almindeligt n\u00f8dvendigt, at mange store PHP-rammer underst\u00f8tter det, herunder <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> og <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>.&#8221;<\/p><\/blockquote>\n<p>Takket v\u00e6re dem kunne vi nu undg\u00e5 at bruge suboptimale og mindre intuitive funktioner som <code>substr<\/code>, <code>strpos<\/code>. Begge funktioner er store og sm\u00e5 bogstaver:<\/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 denne kode i handling <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">her<\/a>.<\/p>\n<p>Denne RFC er godkendt med 51 til 4 stemmer.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> er <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">en ny PHP-funktion<\/a>, der returnerer typen af en variabel. Den nye funktion fungerer p\u00e5 en ganske lignende m\u00e5de som <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\"><code>gettype<\/code><\/a> <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\">funktion<\/a>, men <code>get_debug_type<\/code> returnerer oprindelige type navne og l\u00f8ser klassens navn.<\/p>\n<p>Det er en god forbedring for sproget, da <code>gettype()<\/code> ikke er nyttigt til typekontrol.<\/p>\n<p>RFC giver to nyttige eksempler for bedre at forst\u00e5 forskellen mellem den nye <code>get_debug_type()<\/code> -function og <code>gettype()<\/code>. Det f\u00f8rste eksempel viser <code>gettype<\/code> p\u00e5 arbejdet:<\/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 kunne vi i stedet bruge <code>get_debug_type<\/code>:<\/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>Med PHP 8 kunne vi bruge get_de F\u00f8lgende tabel viser returnerende v\u00e6rdier af <code>get_debug_type<\/code> og <code>gettype<\/code>:<\/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>&#8220;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>A class with name &#8220;Foo\\Bar&#8221;<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>An anonymous class<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">Yderligere RFC&#8217;er<\/h2>\n<p>P\u00e5 dette tidspunkt er flere RFC&#8217;er, der er m\u00e5lrettet mod PHP 8, <a href=\"https:\/\/wiki.php.net\/rfc#in_draft\">stadig i udkast<\/a> og\/eller <a href=\"https:\/\/wiki.php.net\/rfc#pending_implementationlanding\">afventer implementering<\/a>. Vi tilf\u00f8jer dem, s\u00e5 snart deres status \u00e6ndres til &#8220;Implementeret&#8221;.<\/p>\n<p>Her er en hurtig liste over yderligere godkendte forbedringer, der vil v\u00e6re en del af PHP 8:<\/p>\n<ol>\n<li><strong>Stringable interface<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">denne RFC<\/a>\u00a8 introducerer en stringable gr\u00e6nseflade, der automatisk f\u00f8jes til klasser, der implementerer <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\"><code>__to String()<\/code><\/a> <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\">-metoden<\/a>. Det vigtigste m\u00e5l her er at bruge <code>string|Stringable<\/code> union type.<\/li>\n<li><strong>Nye DOM Living Standard API&#8217;er i ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">denne RFC<\/a> foresl\u00e5r at implementere den nuv\u00e6rende <a href=\"https:\/\/dom.spec.whatwg.org\/\">DOM Living Standard<\/a> til <a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">PHP DOM extension<\/a> ved at introducere nye gr\u00e6nseflader og offentlige egenskaber.<\/li>\n<li><strong>Static return type<\/strong>: PHP 8 introducerer brugen af \u200b\u200b<code>static<\/code> som returtype ud for <code>self<\/code>&#8211; og <code>parent<\/code> typer.<\/li>\n<li><strong>Variable Syntax Tweaks<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">denne RFC<\/a> l\u00f8ser nogle resterende uoverensstemmelser i PHPs variable syntax<\/li>\n<\/ol>\n<h2>PHP 8 Ydelse Benchmarks<\/h2>\n<p>Hvis du undrer dig over, hvor hurtigt PHP 8 er, har vi svaret. Vi <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-benchmarks\/\">benchmarkede 20 PHP-platforme\/-konfigurationer<\/a> p\u00e5 7 forskellige PHP-versioner (5.6, 7.0, 7.1, 7.2, 7.3 og 8.0).<\/p>\n<p>PHP 8.0 viste sig som vinderen p\u00e5 de fleste platforme, der underst\u00f8tter det, inklusive <a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-vs-wordpress\/\">WordPress og 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=\"Kompileret PHP benchmarks for de bedste platforme\" width=\"1100\" height=\"799\"><figcaption id=\"caption-attachment-88757\" class=\"wp-caption-text\">Kompileret PHP benchmarks for de bedste platforme<\/figcaption><\/figure>\n<p>For eksempel kan WordPress p\u00e5 PHP 8.0 h\u00e5ndtere <strong>18,4%<\/strong> flere anmodninger i sekundet end PHP 7.4. Ligeledes kan Laravel p\u00e5 PHP 8.0 k\u00f8re <strong>8,5%<\/strong> flere anmodninger i sekundet end PHP 7.3.<\/p>\n<p>Hvis dit websted eller din app er fuldt ud kompatibel med PHP 8.0, b\u00f8r du planl\u00e6gge at <a href=\"https:\/\/kinsta.com\/dk\/changelog\/php-8\/\">opdatere din servers milj\u00f8 til PHP 8.0<\/a> s\u00e5 hurtigt som muligt. Du (og dine brugere) vil helt sikkert s\u00e6tte pris p\u00e5 dens ydeevnefordele. Test dog venligst dit websted grundigt, f\u00f8r du opdaterer.<\/p>\n<p>Du kan l\u00e6se vores <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-benchmarks\/\">PHP-benchmark-artikel<\/a> for mere information, s\u00e5som detaljerede ydeevnedata, indsigt og smukke grafer!<\/p>\n\n<h2>Resum\u00e9<\/h2>\n<p>Hvilken tur! I dette indl\u00e6g d\u00e6kkede vi de mest interessante optimeringer og funktioner, der kommer med PHP 8. Den mest ventede er helt sikkert the Just in Time compiler, men der er s\u00e5 meget mere med PHP 8.<\/p>\n<p>S\u00f8rg for at bogm\u00e6rke dette blogindl\u00e6g til din fremtidige reference. \ud83e\udd13<\/p>\n<p>Nu er det din tur: er du klar til at teste de nye PHP-funktioner? Hvilken er din favorit? Slip en linje i kommentarfeltet nedenfor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 er officielt frigivet til den generelle tilg\u00e6ngelighed den 26. november 2020! Denne nye store opdatering bringer en hel r\u00e6kke optimeringer og kraftfulde funktioner til &#8230;<\/p>\n","protected":false},"author":36,"featured_media":37157,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[39,38],"topic":[726],"class_list":["post-37138","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-php-opdateringer"],"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>Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)<\/title>\n<meta name=\"description\" content=\"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i 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\/dk\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-28T01:31:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T12:37:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\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 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)\",\"datePublished\":\"2020-05-28T01:31:25+00:00\",\"dateModified\":\"2023-08-24T12:37:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\"},\"wordCount\":5216,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"Wordpress Udvikling\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\",\"name\":\"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\",\"datePublished\":\"2020-05-28T01:31:25+00:00\",\"dateModified\":\"2023-08-24T12:37:51+00:00\",\"description\":\"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg\",\"width\":1460,\"height\":730,\"caption\":\"Hvad er nyt i PHP 8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP opdateringer\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/php-opdateringer\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"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\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)","description":"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i 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\/dk\/blog\/php-8\/","og_locale":"da_DK","og_type":"article","og_title":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)","og_description":"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!","og_url":"https:\/\/kinsta.com\/dk\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2020-05-28T01:31:25+00:00","article_modified_time":"2023-08-24T12:37:51+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Carlo Daniele","Estimeret l\u00e6setid":"31 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)","datePublished":"2020-05-28T01:31:25+00:00","dateModified":"2023-08-24T12:37:51+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/"},"wordCount":5216,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","keywords":["php","webdev"],"articleSection":["Wordpress Udvikling"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/","url":"https:\/\/kinsta.com\/dk\/blog\/php-8\/","name":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","datePublished":"2020-05-28T01:31:25+00:00","dateModified":"2023-08-24T12:37:51+00:00","description":"PHP 8 forventes frigivet den 3. december 2020. Det bringer nye funktioner, afskrivninger og ydeevne. Kontroller hvad der er nyt i PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2020\/05\/php-8.jpg","width":1460,"height":730,"caption":"Hvad er nyt i PHP 8"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"PHP opdateringer","item":"https:\/\/kinsta.com\/dk\/emner\/php-opdateringer\/"},{"@type":"ListItem","position":3,"name":"Hvad er nyt i PHP 8 (funktioner, forbedringer og JIT Compiler)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","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\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/37138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=37138"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/37138\/revisions"}],"predecessor-version":[{"id":52162,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/37138\/revisions\/52162"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/translations\/se"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/37138\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/37157"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=37138"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=37138"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=37138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}