{"id":45141,"date":"2022-09-20T10:25:46","date_gmt":"2022-09-20T09:25:46","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=45141&#038;preview=true&#038;preview_id=45141"},"modified":"2023-08-24T11:32:04","modified_gmt":"2023-08-24T10:32:04","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/","title":{"rendered":"Nyheder i PHP 8.2 &#8211; Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere"},"content":{"rendered":"<p>PHP 8.2 bygger p\u00e5 den fornyede base, der er fremsat af <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\">PHP 8.0<\/a> og <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/\">PHP 8.1<\/a>. Nu hvor <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a> er blevet frigivet, lad os d\u00e6kke, hvad der er nyt i PHP 8.2 i detaljer &#8211; fra dets nye funktioner og forbedringer til afskrivninger og mindre \u00e6ndringer, vi vil gennemg\u00e5 dem alle.<\/p>\n<p>Da PHP 8.2 gik ind i sin funktionsfrysning den 19. juli 2022, kan du ikke forvente nogen v\u00e6sentlige tilf\u00f8jelser til denne liste.<\/p>\n<p>Er du sp\u00e6ndt? Det er vi ogs\u00e5.<\/p>\n<p>Lad os begynde!<\/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>Nye funktioner og forbedringer i PHP 8.2<\/h2>\n<p>Lad os starte med at udforske alle de nyeste funktioner i PHP 8.2. Det er en ret omfattende liste:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Nye <code>readonly<\/code> klasser<\/h3>\n<p>PHP 8.1 introducerede <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#new-readonly-properties\"><code>readonly<\/code> <\/a>-funktionen for klasseegenskaber. Nu tilf\u00f8jer PHP 8.2 underst\u00f8ttelse af at <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">deklarere hele klassen som <code>readonly<\/code><\/a>.<\/p>\n<p>Hvis du erkl\u00e6rer en klasse som <code>readonly<\/code>, vil alle dens egenskaber automatisk arve <code>readonly<\/code> -funktionen. At deklarere en klasse <code>readonly<\/code> er s\u00e5ledes det samme som at deklarere alle klassens egenskaber som <code>readonly<\/code>.<\/p>\n<p>Med PHP 8.1 var man f.eks. n\u00f8dt til at skrive denne kedelige kode for at deklarere alle klassens egenskaber som <code>readonly<\/code>:<\/p>\n<pre><code class=\"language-php\">class MyClass\n{\npublic readonly string $myValue,\npublic readonly int $myOtherValue\npublic readonly string $myAnotherValue\npublic readonly int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Forestil dig det samme med mange flere egenskaber. Nu, med PHP 8.2, kan du bare skrive dette:<\/p>\n<pre><code class=\"language-php\">readonly class MyClass\n{\npublic string $myValue,\npublic int $myOtherValue\npublic string $myAnotherValue\npublic int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Du kan ogs\u00e5 erkl\u00e6re abstrakte eller endelige klasser som <code>readonly<\/code>. Her er r\u00e6kkef\u00f8lgen af n\u00f8gleordene ligegyldig.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Du kan ogs\u00e5 deklarere en <code>readonly<\/code> klasse uden egenskaber. Dette forhindrer dynamiske egenskaber, men giver stadig mulighed for, at underklasser kan deklarere deres <code>readonly<\/code> egenskaber eksplicit.<\/p>\n<p>N\u00e6ste punkt er, at <code>readonly<\/code> -klasser kun kan indeholde typede egenskaber &#8211; den samme regel for deklaration af individuelle <strong>skrivebeskyttede<\/strong> egenskaber.<\/p>\n<p>Du kan bruge <code>mixed<\/code> typeegenskaben, hvis du ikke kan deklarere en stricht typet egenskab.<\/p>\n<p>Hvis du fors\u00f8ger at deklarere en <code>readonly<\/code> -klasse uden en typet egenskab, vil det resultere i en Fatal error:<\/p>\n<pre><code class=\"language-php\">readonly class Type {\n    public $nope;\n}\nFatal error: Readonly property Type::$nope must have type in ... on line ... <\/code><\/pre>\n<p>Desuden kan du ikke deklarere <code>readonly<\/code> for visse PHP-funktioner:<\/p>\n<ul>\n<li><strong>Enums <\/strong>(da <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#enums\">de ikke kan indeholde nogen egenskab<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Interfaces<\/strong><\/li>\n<\/ul>\n<p>Fors\u00f8g p\u00e5 at deklarere en af disse funktioner som <code>readonly<\/code> vil resultere i en Parse-fejl.<\/p>\n<pre><code class=\"language-php\">readonly interface Destiny {}\nParse error: syntax error, unexpected token \"interface\", expecting \"abstract\" or \"final\" or \"readonly\" or \"class\" in ... on line ...<\/code><\/pre>\n<p>Som det er tilf\u00e6ldet for alle PHP-keywords, er <code>readonly<\/code> keywordet ikke gengivet med hensyn til store og sm\u00e5 bogstaver.<\/p>\n<p>PHP 8.2 for\u00e6lder ogs\u00e5 dynamiske egenskaber (mere om det senere). Men du kan ikke forhindre, at der tilf\u00f8jes dynamiske egenskaber til en klasse. Men hvis du g\u00f8r det for en <code>readonly<\/code> -klasse, vil det kun resultere i en Fatal Error.<\/p>\n<pre><code class=\"language-php\">Fatal error: Readonly property Test::$test must have type in ... on line ...<\/code><\/pre>\n<h3>Tillad <code>true<\/code>, <code>false<\/code>, og <code>null<\/code> som selvst\u00e6ndige typer<\/h3>\n<p>PHP indeholder allerede skalartyper som <code>int<\/code>, <code>string<\/code>, og <code>bool<\/code>. Dette blev udvidet i PHP 8.0 med tilf\u00f8jelsen af <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-8\/#union-types-2-0\">unionstyper<\/a>, som g\u00f8r det muligt at have v\u00e6rdier af forskellige typer. Samme RFC tillod ogs\u00e5 at bruge <code>false<\/code> og <code>null<\/code> som en del af en union-type &#8211; de var dog ikke tilladt som selvst\u00e6ndige typer.<\/p>\n<p>Hvis du fors\u00f8gte at deklarere <code>false<\/code> eller <code>null<\/code> som selvst\u00e6ndige typer &#8211; uden at de var en del af en union-type &#8211; resulterede det i en fatal error.<\/p>\n<pre><code class=\"language-php\">function spam(): null {}\nfunction eggs(): false {}\n\nFatal error: Null can not be used as a standalone type in ... on line ...\nFatal error: False can not be used as a standalone type in ... on line ...<\/code><\/pre>\n<p>For at undg\u00e5 dette scenarie tilf\u00f8jes der i PHP 8.2 underst\u00f8ttelse for at bruge <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> og <code>null<\/code><\/a> som selvst\u00e6ndige typer. Med denne tilf\u00f8jelse er PHP&#8217;s typesystem mere udtryksfuldt og komplet. Du kan nu deklarere returnerings-, parameter- og egenskabstyperne pr\u00e6cist.<\/p>\n<p>Desuden indeholder PHP stadig ikke en <code>true<\/code> -type, som synes at v\u00e6re en naturlig modpart til <code>false<\/code> -typen. PHP 8.2 retter dette og <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">tilf\u00f8jer ogs\u00e5 underst\u00f8ttelse for typen <code>true<\/code><\/a>. Den tillader ikke coercion, n\u00f8jagtig som <code>false<\/code> -typen opf\u00f8rer sig.<\/p>\n<p>B\u00e5de <code>true<\/code> &#8211; og <code>false<\/code> -typerne er i det v\u00e6sentlige en unionstype af PHP&#8217;s <code>bool<\/code> -type. For at undg\u00e5 redundans kan du ikke deklarere disse tre typer sammen i en unionstype. Hvis du g\u00f8r det, vil det resultere i en fatal error i kompileringstiden.<\/p>\n<h3>DNF-typer (Disjunctive Normal Form)<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">Disjunktiv normalform (DNF)<\/a>\u00a0er en standardiseret m\u00e5de at organisere boolske udtryk p\u00e5. Den best\u00e5r af en disjunktion af konjunktioner &#8211; i boolske termer er det en <strong>OR af AND&#8217;er<\/strong>.<\/p>\n<p>Anvendelse af DNF p\u00e5 typedeklarationer giver mulighed for en standardiseret m\u00e5de at skrive kombinerede Union- og <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#pure-intersection-types\">Intersection-typer<\/a> p\u00e5, som parseren kan h\u00e5ndtere. PHP 8.2&#8217;s <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">nye DNF-typer-funktion<\/a> er enkel, men kraftfuld, hvis den bruges korrekt.<\/p>\n<p>I RFC&#8217;en gives f\u00f8lgende eksempel. Det antager, at f\u00f8lgende gr\u00e6nseflade- og klassedefinitioner allerede findes:<\/p>\n<pre><code class=\"language-php\">interface A {}\ninterface B {}\ninterface C extends A {}\ninterface D {}\n\nclass W implements A {}\nclass X implements B {}\nclass Y implements A, B {}\nclass Z extends Y implements C {}<\/code><\/pre>\n<p>Med DNF-typer kan du udf\u00f8re typedeklarationer for egenskaber, parametre og returv\u00e6rdier p\u00e5 f\u00f8lgende m\u00e5de:<\/p>\n<pre><code class=\"language-php\">\/\/ Accepts an object that implements both A and B,\n\/\/ OR an object that implements D\n(A&B)|D\n\n\/\/ Accepts an object that implements C, \n\/\/ OR a child of X that also implements D,\n\/\/ OR null\nC|(X&D)|null\n\n\/\/ Accepts an object that implements all three of A, B, and D, \n\/\/ OR an int, \n\/\/ OR null.\n(A&B&D)|int|null<\/code><\/pre>\n<p>I nogle tilf\u00e6lde er egenskaberne ikke n\u00f8dvendigvis i DNF-former. Hvis de deklareres som s\u00e5dan, vil det resultere i en parsefejl. Men du kan altid omskrive dem som:<\/p>\n<pre><code class=\"language-php\">A&(B|D)\n\/\/ Can be rewritten as (A&B)|(A&D)\n\nA|(B&(D|W)|null)\n\/\/ Can be rewritten as A|(B&D)|(B&W)|null<\/code><\/pre>\n<p>Du skal v\u00e6re opm\u00e6rksom p\u00e5, at hvert segment af en DNF-type skal v\u00e6re unikt. For eksempel er det ugyldigt at deklarere <code>(A&B)|(B&A)<\/code>, da de to <strong>ORed-segmenter <\/strong>logisk set er de samme.<\/p>\n<p>Hertil kommer, at segmenter, der er strenge delm\u00e6ngder af det andet segment, heller ikke er tilladt. Det skyldes, at overm\u00e6ngden allerede vil have alle forekomster af underm\u00e6ngden, hvilket g\u00f8r det overfl\u00f8digt at bruge DNF.<\/p>\n<h3>Redakt\u00e9r f\u00f8lsomme parametre i backtraces<\/h3>\n<p>Som n\u00e6sten alle <a href=\"https:\/\/kinsta.com\/blog\/best-programming-language-to-learn\/\">programmeringssprog<\/a> tillader <a href=\"https:\/\/kinsta.com\/php\/\">PHP<\/a> at spore sin call stack p\u00e5 ethvert tidspunkt i kodens udf\u00f8relse. Staksporing g\u00f8r det nemt at fejlfinde kode for at rette fejl og flaskehalse i ydelsen. Det udg\u00f8r rygraden i v\u00e6rkt\u00f8jer som <a href=\"https:\/\/kinsta.com\/dk\/apm-tool\/\">Kinsta APM<\/a>, vores specialudviklede <a href=\"https:\/\/kinsta.com\/dk\/blog\/application-performance-monitoring\/\">v\u00e6rkt\u00f8j til overv\u00e5gning af ydeevne<\/a> for WordPress-websteder.<\/p>\n<figure id=\"attachment_121608\" aria-describedby=\"caption-attachment-121608\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-121608\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/04\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions.jpg\" alt=\"Sporing af langsomme WooCommerce-transaktioner med Kinsta APM. \" width=\"1100\" height=\"659\"><figcaption id=\"caption-attachment-121608\" class=\"wp-caption-text\">Sporing af langsomme WooCommerce-transaktioner med Kinsta APM.<\/figcaption><\/figure>\n<p>Udf\u00f8relse af en stack trace stopper ikke programmets udf\u00f8relse. Typisk k\u00f8rer de fleste stack traces i baggrunden og logges lydl\u00f8st &#8211; til senere inspektion, hvis det er n\u00f8dvendigt.<\/p>\n<p>Nogle af disse detaljerede PHP stack traces kan dog v\u00e6re en ulempe, hvis du deler dem med tredjepartstjenester &#8211; normalt med henblik p\u00e5 <a href=\"https:\/\/kinsta.com\/blog\/wordpress-error-log\/\">fejl-loganalyse<\/a>, fejlsporing osv. Disse stack traces kan indeholde f\u00f8lsomme oplysninger som brugernavne, passwords og milj\u00f8variabler.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">Dette RFC-forslag<\/a> giver et s\u00e5dant eksempel:<\/p>\n<blockquote><p>En almindelig &#8220;synder&#8221; er PDO, som tager databasens password som en konstrukt\u00f8rparameter og straks fors\u00f8ger at oprette forbindelse til databasen i konstrukt\u00f8ren i stedet for at have en ren konstrukt\u00f8r og en <strong>separat -&gt;connect()<\/strong> -metode. N\u00e5r databaseforbindelsen mislykkes, vil stack trace&#8217;en s\u00e5ledes indeholde databasens password:<\/p>\n<pre><code class=\"language-php\">PDOException: SQLSTATE[HY000] [2002] No such file or directory in \/var\/www\/html\/test.php:3\nStack trace: #0 \/var\/www\/html\/test.php(3): PDO-&gt;__construct('mysql:host=loca...', 'root', 'password')\n#1 {main}<\/code><\/pre>\n<\/blockquote>\n<p>PHP 8.2 giver mulighed for at <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">markere s\u00e5danne f\u00f8lsomme parametre<\/a> med en ny <code>SensitiveParameter<\/code> -attribut. Alle parametre, der er markeret som f\u00f8lsomme, vil ikke blive opf\u00f8rt i dine backtraces. Du kan s\u00e5ledes dele dem uden problemer med tredjepartstjenester.<\/p>\n<p>Her er et simpelt eksempel med en enkelt f\u00f8lsom parameter:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nfunction example(\n    $ham,\n    #[SensitiveParameter] $eggs,\n    $butter\n) {\n    throw new Exception('Error');\n}\n\nexample('ham', 'eggs', 'butter');\n\n\/*\nFatal error: Uncaught Exception: Error in test.php:8\nStack trace:\n#0 test.php(11): test('ham', Object(SensitiveParameterValue), 'butter')\n#1 {main}\nthrown in test.php on line 8\n*\/<\/code><\/pre>\n<p>N\u00e5r du genererer en backtrace, vil enhver parameter med attributten <code>SensitiveParameter<\/code> blive erstattet med et <code>SensitiveParameterValue<\/code> -objekt, og dens reelle v\u00e6rdi vil aldrig blive gemt i sporingen. <code>SensitiveParameterValue<\/code> -objektet indkapsler den faktiske parameterv\u00e6rdi &#8211; hvis du har brug for den af en eller anden grund.<\/p>\n<h3>Ny <code>mysqli_execute_query<\/code> -funktion og <code>mysqli::execute_query<\/code> -metode<\/h3>\n<p>Har du nogensinde brugt <code>mysqli_query()<\/code> -funktionen med faretruende escaping-brugerv\u00e6rdier, bare for at k\u00f8re en parameteriseret MySQLi-foresp\u00f8rgsel?<\/p>\n<p>PHP 8.2 g\u00f8r det <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">nemmere at k\u00f8re parameteriserede MySQLi-foresp\u00f8rgsler<\/a> med den nye <code>mysqli_execute_query($sql, $params)<\/code> -funktion og <code>mysqli::execute_query<\/code> -metode.<\/p>\n<p>Denne nye funktion er i det v\u00e6sentlige en kombination af funktionerne <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code> og <code>mysqli_stmt_get_result()<\/code>. Med den vil MySQLi-foresp\u00f8rgslen blive forberedt, bundet (hvis du angiver parametre) og udf\u00f8rt inden for selve funktionen. Hvis foresp\u00f8rgslen k\u00f8rer med succes, returnerer den et <code>mysqli_result<\/code> objekt. Hvis det ikke lykkes, returnerer den <code>false<\/code>.<\/p>\n<p>RFC-forslaget giver et enkelt, men effektivt eksempel:<\/p>\n<pre><code class=\"\"language-php\">foreach ($db-&gt;execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) {\nprint_r($row);\n}<\/code><\/pre>\n<h3>Hent <code>enum<\/code> Egenskaber i <code>const<\/code> Udtryk<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">Idenne RFC foresl\u00e5s<\/a> det at tillade operatoren <code>-&gt;\/?-&gt;<\/code> at hente <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a> egenskaber i <code>const<\/code> -udtryk.<\/p>\n<p>Hoved\u00e5rsagen til denne nye funktion er, at man ikke kan bruge <code>enum<\/code> -objekter p\u00e5 visse steder, f.eks. i array-n\u00f8gler. I et s\u00e5dant tilf\u00e6lde skal du gentage v\u00e6rdien af <code>enum<\/code> -objektet bare for at bruge det.<\/p>\n<p>Ved at tillade hentning af <code>enum<\/code> -egenskaber p\u00e5 steder, hvor <code>enum<\/code> -objekter ikke er tilladt, kan man forenkle denne procedure.<\/p>\n<p>Det betyder, at f\u00f8lgende kode nu er gyldig:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>Og for en sikkerheds skyld indeholder denne RFC ogs\u00e5 underst\u00f8ttelse af nullsafe-operatoren <code>?-&gt;<\/code>.<\/p>\n<h3>Tillad konstanter i egenskaber<\/h3>\n<p>PHP indeholder en m\u00e5de at genbruge kode p\u00e5, der kaldes Traits. De er gode til genbrug af kode p\u00e5 tv\u00e6rs af klasser.<\/p>\n<p>I \u00f8jeblikket tillader Traits kun at definere metoder og egenskaber, men ikke konstanter. Det betyder, at du ikke kan definere invarianter, der forventes af en Trait, i selve Trait&#8217;en. For at omg\u00e5 denne begr\u00e6nsning skal du definere konstanter i den sammens\u00e6ttende klasse eller i en gr\u00e6nseflade, der er implementeret af den sammens\u00e6ttende klasse.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">I denne RFC foresl\u00e5s<\/a> det, at det skal v\u00e6re muligt at definere konstanter i Traits. Disse konstanter kan defineres p\u00e5 samme m\u00e5de, som man definerer klassekonstanter. Dette eksempel, der er taget direkte fra RFC&#8217;en, g\u00f8r det klart, hvordan det skal bruges:<\/p>\n<pre><code class=\"language-php\">trait Foo {\n    public const FLAG_1 = 1;\n    protected const FLAG_2 = 2;\n    private const FLAG_3 = 2;\n\n    public function doFoo(int $flags): void {\n        if ($flags & self::FLAG_1) {\n            echo 'Got flag 1';\n        }\n        if ($flags & self::FLAG_2) {\n            echo 'Got flag 2';\n        }\n        if ($flags & self::FLAG_3) {\n        echo 'Got flag 3';\n        }\n    }\n}<\/code><\/pre>\n<p>Trait-konstanterne er ogs\u00e5 integreret i den sammens\u00e6ttende klasses definition, p\u00e5 samme m\u00e5de som en Traits egenskabs- og metodefinitioner. De har ogs\u00e5 de samme begr\u00e6nsninger som egenskaber for Traits. Som n\u00e6vnt i RFC&#8217;en skal der arbejdes videre med dette forslag &#8211; selv om det er en god start &#8211; for at uddybe funktionen.<\/p>\n<h2>For\u00e6ldelser i PHP 8.2<\/h2>\n<p>Vi kan nu g\u00e5 over til at unders\u00f8ge alle deprecations i PHP 8.2. Denne liste er ikke helt s\u00e5 stor som dens nye funktioner:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>For\u00e6ldelse af dynamiske egenskaber (og ny <code>#[AllowDynamicProperties]<\/code> Attribut)<\/h3>\n<p>Indtil PHP 8.1 kunne du <a href=\"https:\/\/kinsta.com\/blog\/php-vs-javascript\/#typing-of-variables\">dynamisk indstille og hente ikke-deklarerede klasseegenskaber dynamisk<\/a> i PHP. For eksempel:<\/p>\n<pre><code class=\"language-php\">class Post {\n    private int $pid;\n}\n\n$post = new Post();\n$post-&gt;name = 'Kinsta';<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Her erkl\u00e6rer klassen <code>Post<\/code> ikke en <code>name<\/code> -egenskab. Men da PHP tillader dynamiske egenskaber, kan du indstille den uden for klassedeklarationen. Det er dens st\u00f8rste &#8211; og muligvis den eneste &#8211; fordel.<\/p>\n<p>Dynamiske egenskaber g\u00f8r det muligt at f\u00e5 uventede fejl og uventet adf\u00e6rd til at dukke op i din kode. Hvis du f.eks. beg\u00e5r en fejl, mens du deklarerer en klasseegenskab uden for klassen, er det let at miste overblikket over den &#8211; is\u00e6r n\u00e5r du debugger eventuelle fejl i den p\u00e5g\u00e6ldende klasse.<\/p>\n<p>Fra og med PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">er dynamiske egenskaber for\u00e6ldet<\/a>. Hvis du s\u00e6tter en v\u00e6rdi til en ikke-deklareret klasseegenskab vil der blive udsendt en deprecation notice f\u00f8rste gang egenskaben s\u00e6ttes.<\/p>\n<pre><code class=\"language-php\">class Foo {}\n$foo = new Foo;\n\n\/\/ Deprecated: Creation of dynamic property Foo::$bar is deprecated\n$foo-&gt;bar = 1;\n\n\/\/ No deprecation warning: Dynamic property already exists.\n$foo-&gt;bar = 2;<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Men fra og med PHP 9.0 og fremefter vil indstillingen af det samme give en <code>ErrorException<\/code> -fejl.<\/p>\n<p>Hvis din kode er fuld af dynamiske egenskaber &#8211; og det er der meget PHP-kode, der er &#8211; og hvis du \u00f8nsker at stoppe disse deprecation-meddelelser efter opgradering til PHP 8.2, kan du bruge PHP 8.2&#8217;s nye <code>#[AllowDynamicProperties]<\/code> -attribut til at tillade dynamiske egenskaber p\u00e5 klasser.<\/p>\n<pre><code class=\"language-php\">#[AllowDynamicProperties]\nclass Pets {}\nclass Cats extends Pets {}\n\n\/\/ You'll get no deprecation warning\n$obj = new Pets;\n$obj-&gt;test = 1;\n\n\/\/ You'll get no deprecation warning for child classes\n$obj = new Cats;\n$obj-&gt;test = 1;<\/code><\/pre>\n<p>If\u00f8lge RFC&#8217;en kan klasser markeret som <code>#[AllowDynamicProperties]<\/code>, samt deres underklasser, fortsat bruge dynamiske egenskaber uden deprecering eller fjernelse.<\/p>\n<p>Du b\u00f8r ogs\u00e5 bem\u00e6rke, at i PHP 8.2 er <code>stdClass<\/code> den eneste klasse, der er markeret som <code>#[AllowDynamicProperties]<\/code>, den eneste klasse i bundtet. Desuden betragtes alle egenskaber, der tilg\u00e5s via <code>__get()<\/code> eller <code>__set()<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\">PHP magic-metoder<\/a>, ikke som dynamiske egenskaber, s\u00e5 de vil ikke give en meddelelse om deprecering.<\/p>\n<h3>Udg\u00e5 delvist underst\u00f8ttede Callables<\/h3>\n<p>En anden \u00e6ndring i PHP 8.2, om end med en mere ubetydelig virkning, er at <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">deprecate delvist underst\u00f8ttede callables<\/a>.<\/p>\n<p>Disse callables kaldes delvist underst\u00f8ttede, fordi du ikke kan interagere med dem direkte via <code>$callable()<\/code>. Du kan kun f\u00e5 adgang til dem med funktionen <code>call_user_func($callable)<\/code>. Listen over s\u00e5danne callables er ikke lang:<\/p>\n<pre><code class=\"language-php\">\"self::method\"\n\"parent::method\"\n\"static::method\"\n[\"self\", \"method\"]\n[\"parent\", \"method\"]\n[\"static\", \"method\"]\n[\"Foo\", \"Bar::method\"]\n[new Foo, \"Bar::method\"]<\/code><\/pre>\n<p>Fra og med PHP 8.2 og fremefter vil ethvert fors\u00f8g p\u00e5 at kalde s\u00e5danne callables &#8211; f.eks. via funktionerne <code>call_user_func()<\/code> eller <code>array_map()<\/code> &#8211; give en deprecation-advarsel.<\/p>\n<p>Den oprindelige RFC giver en solid begrundelse for denne deprecering:<\/p>\n<blockquote><p><em>Bortset fra de to sidste tilf\u00e6lde er alle disse callables kontekstafh\u00e6ngige. Den metode, som <code>\"self::method\"<\/code> henviser til, afh\u00e6nger af, hvilken klasse opkaldet eller kontrollen af opkaldsegnetheden udf\u00f8res fra. I praksis g\u00e6lder dette normalt ogs\u00e5 for de to sidste tilf\u00e6lde, n\u00e5r de anvendes i form af <code>[new Foo, \"parent::method\"]<\/code>.<\/em><\/p>\n<p><em>Reduktion af kontekstafh\u00e6ngigheden af callables er det sekund\u00e6re m\u00e5l med denne RFC. Efter denne RFC er den eneste scope-afh\u00e6ngighed, der stadig er tilbage, metoders synlighed: <code>\"Foo::bar\"<\/code> kan v\u00e6re synlig i \u00e9t scope, men ikke i et andet. Hvis callables fremover begr\u00e6nses til offentlige metoder (mens private metoder skal anvende f\u00f8rste klasses callables eller <code>Closure::fromCallable()<\/code> for at blive uafh\u00e6ngige af anvendelsesomr\u00e5det), vil callable-typen blive veldefineret og kunne anvendes som egenskabstype.<\/em> Der <em>foresl\u00e5s dog ikke \u00e6ndringer i h\u00e5ndteringen af synlighed som led i denne RFC<\/em><\/p><\/blockquote>\n<p>.<br \/>\nI overensstemmelse med den oprindelige RFC vil <code>is_callable()<\/code> -funktionen og <code>callable<\/code> -typen fortsat acceptere disse callables som undtagelser. Men kun indtil underst\u00f8ttelsen af dem fjernes helt fra PHP 9.0 og fremefter.<\/p>\n<p>For at undg\u00e5 forvirring blev omfanget af denne deprecation notice <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">udvidet med en ny RFC<\/a> &#8211; den omfatter nu disse undtagelser.<\/p>\n<p>Det er godt at se, at PHP bev\u00e6ger sig i retning af at have en veldefineret <code>callable<\/code> type.<\/p>\n<h3>For\u00e6ldelse af funktionerne <code>#utf8_encode()<\/code> og <code>utf8_decode()<\/code><\/h3>\n<p>PHP&#8217;s indbyggede funktioner <code>utf8_encode()<\/code> og <code>utf8_decode()<\/code> konverterer strenge kodet i ISO-8859-1 (&#8220;Latin 1&#8221;) til og fra UTF-8.<\/p>\n<p>Deres navne antyder dog en mere generel anvendelse end deres implementering tillader. &#8220;Latin 1&#8221;-kodningen forveksles ofte med andre kodninger som f.eks. &#8220;Windows Code Page 1252&#8221;<\/p>\n<p>Desuden vil du normalt se <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a>, n\u00e5r disse funktioner ikke kan konvertere nogen stricht korrekt. Manglen p\u00e5 fejlmeddelelser betyder ogs\u00e5, at det er sv\u00e6rt at f\u00e5 \u00f8je p\u00e5 dem, is\u00e6r i et hav af ellers l\u00e6selig tekst.<\/p>\n<p>PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">for\u00e6ldet b\u00e5de <code>#utf8_encode()<\/code> og <code>utf8_decode()<\/code> funktionerne<\/a>. Hvis du p\u00e5kalder dem, vil du se disse deprecation notices:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>RFC foresl\u00e5r, at du i stedet bruger <a href=\"https:\/\/kinsta.com\/dk\/blog\/installeres-php\/#all-about-php-extensions\">PHP&#8217;s underst\u00f8ttede udvidelser<\/a> som <code>mbstring<\/code>, <code>iconv<\/code> og <code>intl<\/code>.<\/p>\n<h3>For\u00e6ldelse af <code>${}<\/code> String Interpolation<\/h3>\n<p>PHP tillader indlejring af variabler i strungs med dobbelte anf\u00f8rselstegn (<code>\"<\/code>) og heredoc (<code>&lt;&lt;&lt;<\/code>) p\u00e5 flere m\u00e5der:<\/p>\n<ol>\n<li>Direkte indlejring af variabler &#8211; <code>\u201c$foo\u201d<\/code><\/li>\n<li>Med parenteser uden for variablen &#8211; <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Med parenteser efter dollartegnet &#8211; <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Variable variabler &#8211; <code>\u201c${expr}\u201d<\/code> &#8211; svarer til at bruge <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>De to f\u00f8rste m\u00e5der har deres fordele og ulemper, mens de to sidstn\u00e6vnte har en kompleks og modstridende syntaks. PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">for\u00e6lder de to sidste m\u00e5der at interpolere strenge<\/a> p\u00e5.<\/p>\n<p>Du b\u00f8r holde dig fra at interpolere strenge p\u00e5 denne m\u00e5de fremover:<\/p>\n<pre><code class=\"language-php\">\"Hello, ${world}!\";\nDeprecated: Using ${} in strings is deprecated\n\n\"Hello, ${(world)}!\";\nDeprecated: Using ${} (variable variables) in strings is deprecated<\/code><\/pre>\n<p>Fra og med PHP 9.0 vil disse deprecations blive opgraderet til at kaste en undtagelsesfejl.<\/p>\n<h3>For\u00e6ldelse af mbstring-funktioner for Base64\/QPrint\/Uuencode\/HTML-enheder<\/h3>\n<p>PHP&#8217;s mbstring-funktioner (multi-byte string) hj\u00e6lper os med at arbejde med Unicode, HTML-enheder og andre \u00e6ldre tekstkodninger.<\/p>\n<p>Base64, Uuencode og QPrint er dog ikke tekstkodninger og er stadig en del af disse funktioner &#8211; prim\u00e6rt af legacy-grunde. PHP indeholder ogs\u00e5 separate implementeringer af disse kodninger.<\/p>\n<p>Hvad ang\u00e5r HTML-enheder, har PHP indbyggede funktioner &#8211; <code>htmlspecialchars()<\/code> og <code>htmlentities()<\/code> &#8211; til at h\u00e5ndtere disse bedre. I mods\u00e6tning til mbstring vil disse funktioner f.eks. ogs\u00e5 konvertere <code>&lt;<\/code>. <code>&gt;<\/code>, og <code>&<\/code> -tegn til HTML-entiteter.<\/p>\n<p>Desuden forbedrer PHP hele tiden sine indbyggede funktioner &#8211; <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">ligesom PHP 8.1 med HTML-kodnings- og afkodningsfunktioner<\/a>.<\/p>\n<p>S\u00e5 med alt dette in mente, <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">forkaster<\/a> PHP 8.2 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">brugen af mbstring til disse kodninger<\/a> (etiketterne er ikke skivende):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (alias for HTML-ENTITIES)<\/li>\n<li>Anf\u00f8rselstegn-udskrivbar<\/li>\n<li>qprint (alias for Quoted-Printable)<\/li>\n<\/ul>\n<p>Fra og med PHP 8.2 vil brugen af mbstring til kodning\/afkodning af en af ovenst\u00e5ende kodninger give en deprecation notice. PHP 9.0 vil fjerne mbstring-underst\u00f8ttelse for disse kodninger helt og holdent.<\/p>\n<h2>Andre mindre \u00e6ndringer i PHP 8.2<\/h2>\n<p>Endelig kan vi diskutere PHP 8.2&#8217;s mindre \u00e6ndringer, herunder de fjernede funktioner.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Fjern underst\u00f8ttelse af libmysql fra mysqli<\/h3>\n<p>Fra nu af tillader PHP b\u00e5de <code>mysqli<\/code> &#8211; og <code>PDO_mysql<\/code> -drivere at bygge mod <code>mysqlnd<\/code> &#8211; og <code>libmysql<\/code> -bibliotekerne. Standarddriveren og den anbefalede driver siden PHP 5.4 har dog v\u00e6ret <code>mysqlnd<\/code>.<\/p>\n<p>Begge disse drivere har mange fordele og ulemper. Men hvis man fjerner underst\u00f8ttelsen af en af dem &#8211; ideelt set <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\">fjerner man <code>libmysql<\/code><\/a>, da det ikke er standard &#8211; vil det forenkle PHP&#8217;s kode og enhedstests.<\/p>\n<p>For at argumentere for denne fordel, opregner RFC&#8217;en mange fordele ved <code>mysqlnd<\/code>:<\/p>\n<ul>\n<li>Det er pakket med PHP<\/li>\n<li>Det bruger PHP-hukommelsesstyring til at overv\u00e5ge hukommelsesforbruget og<br \/>\n<a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-ydeevnen\/\">forbedre ydeevnen<\/a><\/li>\n<li>Giver funktioner til at sikre livskvalitet (f.eks. <code>get_result()<\/code>)<\/li>\n<li>Returnerer numeriske v\u00e6rdier ved hj\u00e6lp af PHP&#8217;s native typer<\/li>\n<li>Dens funktionalitet er ikke afh\u00e6ngig af det eksterne bibliotek<\/li>\n<li>Valgfri plugin-funktionalitet<\/li>\n<li>Underst\u00f8tter asynkrone foresp\u00f8rgsler<\/li>\n<\/ul>\n<p>RFC&#8217;en opregner ogs\u00e5 nogle fordele ved <code>libmysql<\/code>, herunder:<\/p>\n<ul>\n<li>Auto-reconnect er muligt (<code>mysqlnd<\/code> underst\u00f8tter ikke denne funktionalitet med vilje, fordi den let kan udnyttes)<\/li>\n<li>LDAP- og SASL-godkendelsestilstande (<code>mysqlnd<\/code> <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">tilf\u00f8jer muligvis<\/a> ogs\u00e5 snart <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">denne funktion<\/a> )<\/li>\n<\/ul>\n<p>Desuden n\u00e6vner RFC&#8217;en mange ulemper ved <code>libmysql<\/code> &#8211; inkompatibilitet med PHP&#8217;s hukommelsesmodel, mange fejlslagne tests, hukommelsesl\u00e6kager, forskellige funktionaliteter fra version til version osv.<\/p>\n<p>Med alt dette in mente fjernede PHP 8.2 underst\u00f8ttelsen af at bygge <code>mysqli<\/code> mod <code>libmysql<\/code>.<\/p>\n<p>Hvis du \u00f8nsker at tilf\u00f8je en funktionalitet, der kun er tilg\u00e6ngelig med <code>libmysql<\/code>, skal du tilf\u00f8je den eksplicit til<code> mysqlnd<\/code> som en feature request. Du kan heller ikke tilf\u00f8je auto-reconnect.<\/p>\n<h3>Lokalitetsuafh\u00e6ngig case-konvertering<\/h3>\n<p>F\u00f8r <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-8\/\">PHP 8.0<\/a> blev PHP&#8217;s locale arvet fra systemmilj\u00f8et. Men dette kunne give problemer i nogle edge-tilf\u00e6lde.<\/p>\n<p>Hvis du indstiller dit sprog, mens du installerer Linux, vil du indstille det passende sprog for brugergr\u00e6nsefladen for <a href=\"https:\/\/kinsta.com\/blog\/linux-commands\/\">de indbyggede kommandoer<\/a>. Det \u00e6ndrer dog ogs\u00e5 uventet hvordan C-bibliotekets strengh\u00e5ndteringsfunktionalitet fungerer.<\/p>\n<p>Hvis du f.eks. har valgt sproget &#8220;tyrkisk&#8221; eller &#8220;kasakhisk&#8221;, da du installerede Linux, vil du opdage, at hvis du kalder <code>toupper('i')<\/code> for at f\u00e5 det tilsvarende store bogstav, vil du f\u00e5 det <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">prikkede store I<\/a> (U+0130, <code>\u0130<\/code>).<\/p>\n<p>PHP 8.0 har stoppet denne uregelm\u00e6ssighed ved at indstille standardlokalskalaen til &#8220;C&#8221;, medmindre brugeren udtrykkeligt \u00e6ndrer den via <code>setlocale()<\/code>.<\/p>\n<p>PHP 8.2 g\u00e5r endnu l\u00e6ngere ved at <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">fjerne lokalf\u00f8lsomhed fra konvertering af store og sm\u00e5 bogstaver<\/a>. Denne RFC \u00e6ndrer prim\u00e6rt <code>strtolower()<\/code>, <code>strtoupper()<\/code> og relaterede funktioner. L\u00e6s RFC&#8217;en for at f\u00e5 en liste over alle de ber\u00f8rte funktioner.<\/p>\n<p>Som et alternativ kan du bruge <code>mb_strtolower()<\/code>, hvis du \u00f8nsker at bruge lokaliseret konvertering af store og sm\u00e5 bogstaver.<\/p>\n<h3><span style=\"color: #0c022f;font-family: 'Brandon Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1.25rem;font-weight: 900\">Forbedring af tilf\u00e6ldig udvidelse<\/span><\/h3>\n<p>PHP har planer om at <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">gennemg\u00e5 sin tilf\u00e6ldige funktionalitet<\/a>.<\/p>\n<p>Som det er nu, er PHP&#8217;s tilf\u00e6ldige funktionalitet st\u00e6rkt afh\u00e6ngig af <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">Mersenne Twister-tilstanden<\/a>. Denne tilstand er imidlertid implicit gemt i PHP&#8217;s globale omr\u00e5de &#8211; der er ingen m\u00e5de, hvorp\u00e5 en bruger kan f\u00e5 adgang til den. Tilf\u00f8jelse af randomiserings-funktioner mellem den indledende seedningsfase og den tilsigtede brug ville \u00f8del\u00e6gge koden.<\/p>\n<p>Vedligeholdelse af en s\u00e5dan kode kan v\u00e6re endnu mere kompliceret, n\u00e5r din kode bruger eksterne pakker.<\/p>\n<p>PHP&#8217;s nuv\u00e6rende tilf\u00e6ldige funktionalitet kan s\u00e5ledes ikke reproducere tilf\u00e6ldige v\u00e6rdier p\u00e5 en konsekvent m\u00e5de. Den fejler endda i empiriske statistiske tests af ensartede tilf\u00e6ldige talgeneratorer, som <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">TestU01&#8217;s Crush og BigCrush<\/a>. Mersenne Twister&#8217;s 32-bit begr\u00e6nsning forv\u00e6rrer dette yderligere.<\/p>\n<p>Derfor anbefales det ikke at bruge PHP&#8217;s indbyggede funktioner &#8211; <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> &#8211; hvis du har brug for kryptografisk sikre tilf\u00e6ldige tal. I s\u00e5danne tilf\u00e6lde skal du implementere en ny funktion ved hj\u00e6lp af <code>random_int()<\/code> eller lignende funktioner.<\/p>\n<p>Der blev imidlertid rejst <a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">flere problemer med denne RFC<\/a> efter at afstemningen var begyndt. Dette tilbageslag tvang PHP-holdet til at notere alle problemerne i en separat RFC, hvor der blev oprettet en afstemningsmulighed for hvert problem. De vil f\u00f8rst beslutte at g\u00e5 videre, n\u00e5r der er opn\u00e5et konsensus.<\/p>\n<h2>Yderligere RFC&#8217;er i PHP 8.2<\/h2>\n<p>PHP 8.2 indeholder ogs\u00e5 mange nye funktioner og mindre \u00e6ndringer. Vi n\u00e6vner dem nedenfor med links til yderligere ressourcer:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Ny <code>curl_upkeep<\/code> funktion<\/a>: PHP 8.2 tilf\u00f8jer denne nye funktion til sin Curl-udvidelse. Den kalder <code>curl_easy_upkeep()<\/code> -funktionen i libcurl, det underliggende C-bibliotek, som PHP Curl-udvidelsen bruger.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Ny <code>ini_parse_quantity<\/code> -funktion<\/a>: PHP INI-direktiver accepterer datast\u00f8rrelser med et multiplikator-suffiks. Du kan f.eks. skrive 25 megabyte som <code>25M<\/code>, eller 42 gigabyte som bare <code>42G<\/code>. Disse suffikser er almindelige i PHP INI-filer, men er ualmindelige andre steder. Denne nye funktion analyserer <a href=\"https:\/\/kinsta.com\/dk\/blog\/maksimale-uploadstorrelse-i-wordpress\/#create-or-modify-the-phpini-file\">PHP INI-v\u00e6rdierne<\/a> og returnerer deres datast\u00f8rrelse i bytes.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Ny funktion <code>memory_reset_peak_usage<\/code>:<\/a> Denne funktion nulstiller det maksimale hukommelsesforbrug, der returneres af <code>memory_get_peak_usage<\/code> -funktionen. Det kan v\u00e6re praktisk, n\u00e5r du k\u00f8rer den samme handling flere gange og \u00f8nsker at registrere hver enkelt k\u00f8rsels maksimale hukommelsesforbrug.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">Underst\u00f8ttelse af no-capture-modifikator (<code>\/n<\/code>) i <code>preg_*<\/code> -funktioner<\/a>: I regex angiver metakendetegn <code>()<\/code> en opfangende gruppe. Det betyder, at alle matches for udtrykket inden for parentesen returneres. PHP 8.2 tilf\u00f8jer en no-capture-modifikator (<code>\/n<\/code>) for at stoppe denne adf\u00e6rd.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\">F\u00e5 <code>iterator_*()<\/code> -familien til at acceptere alle iterables<\/a>: Som det er nu, accepterer PHP&#8217;s <code>iterator_*()<\/code> -familie kun <code>Traversables<\/code> (dvs. ingen almindelige arrays er tilladt). Det er un\u00f8dvendigt begr\u00e6nsende, og denne RFC retter det.<\/li>\n<\/ol>\n<h2>Opsummering<\/h2>\n<p>PHP 8.2 bygger videre p\u00e5 de massive forbedringer i PHP 8.0 og PHP 8.1, hvilket ikke er nogen let opgave. Vi mener, at de mest sp\u00e6ndende funktioner i PHP 8.2 er de nye standalone-typer, readonly properties og de mange forbedringer af ydeevnen.<\/p>\n<p>Vi kan ikke vente med at <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-benchmarks\/\">benchmarke PHP<\/a> 8.2 med forskellige <a href=\"https:\/\/kinsta.com\/dk\/blog\/php-framework\/\">PHP-frameworks<\/a> og <a href=\"https:\/\/kinsta.com\/wordpress-market-share\/\">CMS&#8217;er<\/a>.<\/p>\n<p>S\u00f8rg for at bogm\u00e6rke dette blogindl\u00e6g til fremtidig reference.<\/p>\n<p><em>Hvilke PHP 8.2-funktioner er dine foretrukne? Hvilke deprecations er dine mindst foretrukne? Del dine tanker med vores f\u00e6llesskab i kommentarerne!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.2 bygger p\u00e5 den fornyede base, der er fremsat af PHP 8.0 og PHP 8.1. Nu hvor PHP 8.2 er blevet frigivet, lad os d\u00e6kke, &#8230;<\/p>\n","protected":false},"author":117,"featured_media":45142,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[726],"class_list":["post-45141","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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>Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere<\/title>\n<meta name=\"description\" content=\"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.\" \/>\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-2\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere\" \/>\n<meta property=\"og:description\" content=\"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\" \/>\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=\"2022-09-20T09:25:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:32:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\" \/>\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\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 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-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Nyheder i PHP 8.2 &#8211; Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere\",\"datePublished\":\"2022-09-20T09:25:46+00:00\",\"dateModified\":\"2023-08-24T10:32:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\"},\"wordCount\":3460,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\",\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\",\"name\":\"Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\",\"datePublished\":\"2022-09-20T09:25:46+00:00\",\"dateModified\":\"2023-08-24T10:32:04+00:00\",\"description\":\"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#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\":\"Nyheder i PHP 8.2 &#8211; Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere\"}]},{\"@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\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere","description":"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.","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-2\/","og_locale":"da_DK","og_type":"article","og_title":"Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere","og_description":"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.","og_url":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-09-20T09:25:46+00:00","article_modified_time":"2023-08-24T10:32:04+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Salman Ravoof","Estimeret l\u00e6setid":"17 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Nyheder i PHP 8.2 &#8211; Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere","datePublished":"2022-09-20T09:25:46+00:00","dateModified":"2023-08-24T10:32:04+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/"},"wordCount":3460,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/","name":"Nyheder i PHP 8.2 - Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","datePublished":"2022-09-20T09:25:46+00:00","dateModified":"2023-08-24T10:32:04+00:00","description":"PHP 8.2. er blevet frigivet. Opdag alle de nye funktioner, forbedringer, udfasninger og mindre \u00e6ndringer, der f\u00f8lger med udgivelsen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/whats-new-in-php-82.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/php-8-2\/#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":"Nyheder i PHP 8.2 &#8211; Nye funktioner, for\u00e6ldelser, \u00e6ndringer og meget mere"}]},{"@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\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/dk\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45141","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\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=45141"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45141\/revisions"}],"predecessor-version":[{"id":47312,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45141\/revisions\/47312"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/translations\/se"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45141\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/45142"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=45141"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=45141"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=45141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}