{"id":45770,"date":"2022-09-20T14:21:24","date_gmt":"2022-09-20T14:21:24","guid":{"rendered":"https:\/\/kinsta.com\/se\/?p=45770&#038;preview=true&#038;preview_id=45770"},"modified":"2023-09-21T09:26:37","modified_gmt":"2023-09-21T09:26:37","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/","title":{"rendered":"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer"},"content":{"rendered":"<p>PHP 8.2 bygger p\u00e5 den f\u00f6rnyade basen fr\u00e5n <a href=\"https:\/\/kinsta.com\/se\/blog\/php-8\/\">PHP 8.0<\/a> och <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/\">PHP 8.1<\/a>. Nu n\u00e4r <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a> har sl\u00e4ppts, ska vi g\u00e5 igenom vad som \u00e4r nytt i PHP 8.2 i detalj &#8211; fr\u00e5n dess nya funktioner och f\u00f6rb\u00e4ttringar till utfasningar och mindre \u00e4ndringar, vi kommer att g\u00e5 igenom dem alla.<\/p>\n<p>Eftersom PHP 8.2 gick in i sin funktionsfrysning den 19 juli \u00e5r 2022 kan du inte f\u00f6rv\u00e4nta dig n\u00e5gra st\u00f6rre till\u00e4gg till den h\u00e4r listan.<\/p>\n<p>\u00c4r du sp\u00e4nd? Det \u00e4r vi ocks\u00e5.<\/p>\n<p>L\u00e5t oss b\u00f6rja!<\/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>Nya funktioner och f\u00f6rb\u00e4ttringar i PHP 8.2<\/h2>\n<p>L\u00e5t oss b\u00f6rja med att utforska alla de senaste funktionerna i PHP 8.2. Det \u00e4r en ganska omfattande lista:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Nya <code>readonly<\/code> klasser<\/h3>\n<p>I PHP 8.1 introducerades <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#new-readonly-properties\">funktionen<code>readonly<\/code> f\u00f6r klassegenskaper<\/a>. Nu l\u00e4gger PHP 8.2 till st\u00f6d f\u00f6r att <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">deklarera hela klassen som <code>readonly<\/code><\/a>.<\/p>\n<p>Om du deklarerar en klass som <code>readonly<\/code> kommer alla dess egenskaper automatiskt att \u00e4rva funktionen <code>readonly<\/code>. Att deklarera en klass <code>readonly<\/code> \u00e4r allts\u00e5 detsamma som att deklarera varje klassegenskap som <code>readonly<\/code>.<\/p>\n<p>Med PHP 8.1 var du exempelvis tvungen att skriva denna tr\u00e5kiga kod f\u00f6r att deklarera alla klassegenskaper 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>F\u00f6rest\u00e4ll dig samma sak med m\u00e5nga fler egenskaper. Nu, med PHP 8.2, r\u00e4cker det om du skriver detta:<\/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 \u00e4ven deklarera abstrakta eller slutgiltiga klasser som <code>readonly<\/code>. H\u00e4r spelar ordningsf\u00f6ljden p\u00e5 nyckelorden ingen roll.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Du kan \u00e4ven deklarera en <code>readonly<\/code> -klass utan egenskaper. Detta f\u00f6rhindrar dynamiska egenskaper, men g\u00f6r det \u00e4nd\u00e5 m\u00f6jligt f\u00f6r underklasser att deklarera sina <code>readonly<\/code>-egenskaper .<\/p>\n<p>N\u00e4sta steg \u00e4r att <code>readonly<\/code> -klasser endast kan inneh\u00e5lla typade egenskaper \u2014 samma regel som f\u00f6r att deklarera enskilda <strong>readonly<\/strong>-egenskaper.<\/p>\n<p>Du kan anv\u00e4nda typegenskapen <code>mixed<\/code> om du inte kan deklarera en strikt typad egenskap.<\/p>\n<p>Om du f\u00f6rs\u00f6ker att deklarera en <code>readonly<\/code> -klass utan en typad egenskap kommer detta att resultera i ett fel:<\/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>Du kan inte heller deklarera <code>readonly<\/code> f\u00f6r vissa PHP-funktioner:<\/p>\n<ul>\n<li><strong>Enums <\/strong>(eftersom <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#enums\">de inte kan inneh\u00e5lla n\u00e5gon egenskap<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Gr\u00e4nssnitt<\/strong><\/li>\n<\/ul>\n<p>Om du f\u00f6rs\u00f6ker att deklarera n\u00e5gon av dessa funktioner som <code>readonly<\/code> kommer detta att resultera i ett fel i analysen.<\/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>Precis som f\u00f6r alla PHP-nyckelord \u00e4r nyckelordet <code>readonly<\/code> ok\u00e4nsligt f\u00f6r storleken p\u00e5 skiftl\u00e4get.<\/p>\n<p>PHP 8.2 avskaffar \u00e4ven dynamiska egenskaper (mer om detta senare). Men du kan inte f\u00f6rhindra att dynamiska egenskaper l\u00e4ggs till i en klass. Att g\u00f6ra detta f\u00f6r en <code>readonly<\/code> -klass resulterar dock bara i ett fel.<\/p>\n<pre><code class=\"language-php\">Fatal error: Readonly property Test::$test must have type in ... on line ...<\/code><\/pre>\n<h3>Till\u00e5t <code>true<\/code>, <code>false<\/code> och <code>null<\/code> som frist\u00e5ende typer<\/h3>\n<p>PHP inneh\u00e5ller redan skal\u00e4ra typer som <code>int<\/code>, <code>string<\/code> och <code>bool<\/code>. Detta ut\u00f6kades i PHP 8.0 med <a href=\"https:\/\/kinsta.com\/se\/blog\/php-8\/#union-types-2-0\">unionstyper<\/a> som g\u00f6r det m\u00f6jligt f\u00f6r v\u00e4rden att vara av olika typer. I samma RFC till\u00e5ts \u00e4ven att <code>false<\/code> och <code>null<\/code> anv\u00e4nds som en del av en unionstyp \u2014 de till\u00e5ts dock inte som frist\u00e5ende typer.<\/p>\n<p>Om du f\u00f6rs\u00f6kte deklarera <code>false<\/code> eller <code>null<\/code> som frist\u00e5ende typer \u2014 utan att de var en del av en unionstyp \u2014 resulterade detta i ett fel.<\/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>F\u00f6r att undvika detta scenario har PHP 8.2 lagt till st\u00f6d f\u00f6r att anv\u00e4nda <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> och <code>null<\/code><\/a> som frist\u00e5ende typer. Med detta till\u00e4gg blir PHP:s typsystem mer uttrycksfullt och komplett. Du kan nu deklarera retur-, parameter- och egenskapstyperna exakt.<\/p>\n<p>Dessutom inneh\u00e5ller PHP fortfarande inte en <code>true<\/code> -typ, som verkar vara en naturlig motsvarighet till <code>false<\/code> -typen. PHP 8.2 \u00e5tg\u00e4rdar detta och <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">l\u00e4gger till st\u00f6d \u00e4ven f\u00f6r typen <code>true<\/code><\/a>. Den till\u00e5ter inte coercion, som fungerar precis som typen <code>false<\/code>.<\/p>\n<p>B\u00e5de typerna <code>true<\/code> och <code>false<\/code> \u00e4r i huvudsak en unionstyp av PHP:s typ <code>bool<\/code>. F\u00f6r att undvika redundans kan du inte deklarera dessa tre typer tillsammans i en unionstyp. Om du g\u00f6r detta kommer det att resultera i ett fel under kompileringstiden.<\/p>\n<h3>DNF-typer (Disjunctive Normal Form)<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">Disjunctive Normal Form (DNF)<\/a> \u00e4r ett standardiserat s\u00e4tt att organisera boolska uttryck. Det best\u00e5r av en disjunktion av konjunktioner \u2014 i boolska termer \u00e4r det en <strong>OR av ANDs<\/strong>.<\/p>\n<p>Genom att till\u00e4mpa DNF p\u00e5 typdeklarationer s\u00e5 kan man p\u00e5 ett standardiserat s\u00e4tt skriva kombinerade Union- och <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#pure-intersection-types\">Intersection-typer<\/a> som tolkaren kan hantera. PHP 8.2:s <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">nya funktion f\u00f6r DNF-typer<\/a> \u00e4r enkel men kraftfull om den anv\u00e4nds p\u00e5 r\u00e4tt s\u00e4tt.<\/p>\n<p>I RFC ges f\u00f6ljande exempel. Det f\u00f6ruts\u00e4tter att f\u00f6ljande gr\u00e4nssnitts- och klassdefinitioner redan finns:<\/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 utf\u00f6ra typdeklarationer f\u00f6r egenskaper, parametrar och returv\u00e4rden p\u00e5 f\u00f6ljande s\u00e4tt:<\/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 vissa fall kan egenskaperna inte vara i DNF-form. Att deklarera dem som s\u00e5dana kommer att resultera i ett tolkningsfel. Men du kan alltid skriva om 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 b\u00f6r notera att varje segment av en DNF-typ m\u00e5ste vara unikt. Att deklarera <code>(A&B)|(B&A)<\/code> \u00e4r till exempel ogiltigt eftersom de tv\u00e5 <strong>OR<\/strong>ed-segmenten \u00e4r logiskt sett samma.<\/p>\n<p>Dessutom \u00e4r segment som \u00e4r strikta delm\u00e4ngder av det andra segmentet inte heller till\u00e5tna. Detta beror p\u00e5 att \u00f6verm\u00e4ngden redan kommer att ha alla instanser av underm\u00e4ngden, vilket g\u00f6r det \u00f6verfl\u00f6digt att anv\u00e4nda DNF.<\/p>\n<h3>Redakturera k\u00e4nsliga parametrar i tillbakasp\u00e5r<\/h3>\n<p>Liksom n\u00e4stan alla <a href=\"https:\/\/kinsta.com\/se\/blog\/basta-programmeringsspraket-att-lara-sig\/\">programmeringsspr\u00e5k<\/a> till\u00e5ter <a href=\"https:\/\/kinsta.com\/php\/\">PHP<\/a> sp\u00e5rning av anropsstacken n\u00e4r som helst under kodens exekvering. Stack-sp\u00e5rning g\u00f6r det enkelt att fels\u00f6ka kod f\u00f6r att \u00e5tg\u00e4rda fel och flaskhalsar i prestanda. Det utg\u00f6r ryggraden i verktyg som <a href=\"https:\/\/kinsta.com\/se\/apm-verktyg\/\">Kinsta APM<\/a>, v\u00e5rt specialutvecklade <a href=\"https:\/\/kinsta.com\/se\/blog\/applikationsprestandaovervakning\/\">verktyg f\u00f6r \u00f6vervakning av prestanda<\/a> f\u00f6r WordPress-webbplatser.<\/p>\n<figure id=\"attachment_121608\" aria-describedby=\"caption-attachment-121608\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-121608 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/04\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions.jpg\" alt=\"Sp\u00e5rning av l\u00e5ngsamma WooCommerce-transaktioner med Kinsta APM.\" width=\"1100\" height=\"659\"><figcaption id=\"caption-attachment-121608\" class=\"wp-caption-text\">Sp\u00e5rning av l\u00e5ngsamma WooCommerce-transaktioner med Kinsta APM.<\/figcaption><\/figure>\n<p>Att utf\u00f6ra en stacksp\u00e5rning stoppar inte programmets exekvering. Typiskt sett k\u00f6rs de flesta stacksp\u00e5rningar i bakgrunden och loggas tyst \u2014 f\u00f6r senare inspektion om det kr\u00e4vs.<\/p>\n<p>Vissa av dessa detaljerade PHP-stacksp\u00e5rare kan dock vara en nackdel om du delar dem med tredjepartstj\u00e4nster \u2014 vanligtvis f\u00f6r <a href=\"https:\/\/kinsta.com\/blog\/wordpress-error-log\/\">analys av felloggar<\/a>, felsp\u00e5rning osv. Dessa stacksp\u00e5rare kan inneh\u00e5lla k\u00e4nslig information som anv\u00e4ndarnamn, l\u00f6senord och milj\u00f6variabler.<\/p>\n<p>I <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">detta RFC-f\u00f6rslag<\/a> ges ett s\u00e5dant exempel:<\/p>\n<blockquote><p>En vanlig &#8221;brottsling&#8221; \u00e4r PDO som tar databasens l\u00f6senord som en konstrukt\u00f6rsparameter och omedelbart f\u00f6rs\u00f6ker ansluta till databasen i konstrukt\u00f6ren, i st\u00e4llet f\u00f6r att ha en ren konstrukt\u00f6r och en <strong>separat -&gt;connect()<\/strong>-metod. N\u00e4r databasanslutningen misslyckas kommer stacksp\u00e5rningen att inneh\u00e5lla databasl\u00f6senordet:<\/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 g\u00f6r det m\u00f6jligt att <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">markera s\u00e5dana k\u00e4nsliga parametrar<\/a> med det nya attributet <code>SensitiveParameter<\/code>. Alla parametrar som \u00e4r markerade som k\u00e4nsliga kommer inte att listas i dina tillbakasp\u00e5rningar. P\u00e5 s\u00e5 s\u00e4tt kan du dela dem utan problem med tredjepartstj\u00e4nster.<\/p>\n<p>H\u00e4r \u00e4r ett enkelt exempel med en enda k\u00e4nslig 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\u00e4r du genererar en bak\u00e5tsp\u00e5rning kommer alla parametrar med attributet <code>\\SensitiveParameter<\/code> att ers\u00e4ttas med ett <code>\\SensitiveParameterValue<\/code> -objekt, och dess verkliga v\u00e4rde kommer aldrig att lagras i sp\u00e5rningen. Objektet <code>SensitiveParameterValue<\/code> kapslar in det faktiska parameterv\u00e4rdet \u2014 om du beh\u00f6ver det av n\u00e5gon anledning.<\/p>\n<h3>Ny funktion <code>mysqli_execute_query<\/code> och metod <code>mysqli::execute_query<\/code><\/h3>\n<p>Har du n\u00e5gonsin anv\u00e4nt <code>mysqli_query()<\/code> -funktionen med farligt undanglidande anv\u00e4ndarv\u00e4rden bara f\u00f6r att k\u00f6ra en parameterstyrd MySQLi-fr\u00e5ga?<\/p>\n<p>PHP 8.2 g\u00f6r det <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">enklare att k\u00f6ra parameterbaserade MySQLi-fr\u00e5gor<\/a> med den nya funktionen <code>mysqli_execute_query($sql, $params)<\/code> och metoden <code>mysqli::execute_query<\/code>.<\/p>\n<p>Den nya funktionen \u00e4r i huvudsak en kombination av funktionerna <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code> och <code>mysqli_stmt_get_result()<\/code>. Med den kommer MySQLi-fr\u00e5gan att f\u00f6rberedas, bindas (om du skickar n\u00e5gra parametrar) och exekveras inom sj\u00e4lva funktionen. Om fr\u00e5gan k\u00f6rs framg\u00e5ngsrikt returneras ett <code>mysqli_result<\/code> -objekt. Om den inte lyckas returnerar den <code>false<\/code>.<\/p>\n<p>RFC-f\u00f6rslaget ger ett enkelt men kraftfullt exempel:<\/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>H\u00e4mta <code>enum<\/code>-egenskaper i <code>const<\/code>-uttryck<\/h3>\n<p>I <a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">detta RFC f\u00f6resl\u00e5s<\/a> att <code>-&gt;\/?-&gt;<\/code> -operat\u00f6ren ska kunna h\u00e4mta <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a>-egenskaper i <code>const<\/code>-uttryck.<\/p>\n<p>Huvudsk\u00e4let till denna nya funktion \u00e4r att man inte kan anv\u00e4nda <code>enum<\/code>-objekt p\u00e5 vissa st\u00e4llen, t.ex. i array-nycklar. I s\u00e5dana fall m\u00e5ste du upprepa v\u00e4rdet i <code>enum<\/code>-fallet bara f\u00f6r att anv\u00e4nda det.<\/p>\n<p>Genom att till\u00e5ta h\u00e4mtning av <code>enum<\/code>-egenskaper p\u00e5 st\u00e4llen d\u00e4r <code>enum<\/code>-objekt inte \u00e4r till\u00e5tna kan detta f\u00f6rfarande f\u00f6renklas.<\/p>\n<p>Det inneb\u00e4r att f\u00f6ljande kod nu \u00e4r giltig:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>Denna RFC inkluderar f\u00f6r s\u00e4kerhets skull \u00e4ven st\u00f6d f\u00f6r nullsafe-operat\u00f6ren <code>?-&gt;<\/code>.<\/p>\n<h3>Till\u00e5t konstanter i egenskaper<\/h3>\n<p>PHP inkluderar ett s\u00e4tt att \u00e5teranv\u00e4nda kod som kallas Traits. De \u00e4r utm\u00e4rkta f\u00f6r \u00e5teranv\u00e4ndning av kod i olika klasser.<\/p>\n<p>F\u00f6r n\u00e4rvarande till\u00e5ter Traits endast att man definierar metoder och egenskaper, men inte konstanter. Detta betyder att du inte kan definiera in varianter som f\u00f6rv\u00e4ntas av en Trait i sj\u00e4lva Trait. F\u00f6r att kringg\u00e5 denna begr\u00e4nsning m\u00e5ste du definiera konstanter i den komponerande klassen eller i ett gr\u00e4nssnitt som implementeras av den komponerande klassen.<\/p>\n<p>I <a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">detta RFC f\u00f6resl\u00e5s<\/a> att det ska vara m\u00f6jligt att definiera konstanter i Traits. Dessa konstanter kan definieras p\u00e5 samma s\u00e4tt som man definierar klasskonstanter. Det h\u00e4r exemplet, som \u00e4r h\u00e4mtat direkt fr\u00e5n RFC, klarg\u00f6r anv\u00e4ndningen:<\/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-konstanter sl\u00e5s \u00e4ven samman med den sammansatta klassens definition, p\u00e5 samma s\u00e4tt som en Traits egenskaps- och metoddefinitioner. De har \u00e4ven liknande begr\u00e4nsningar som egenskaper f\u00f6r Traits. Som noteras i RFC beh\u00f6ver detta f\u00f6rslag \u2014 \u00e4ven om det \u00e4r en bra b\u00f6rjan \u2014 ytterligare arbete f\u00f6r att utveckla funktionen.<\/p>\n<h2>Avskrivningar i PHP 8.2<\/h2>\n<p>Vi kan nu g\u00e5 \u00f6ver till att utforska alla avskrivningar i PHP 8.2. Den h\u00e4r listan \u00e4r inte lika stor som de nya funktionerna:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Avskaffa dynamiska egenskaper (och nytt attribut <code>#[AllowDynamicProperties]<\/code>)<\/h3>\n<p>Fram till PHP 8.1 kunde du <a href=\"https:\/\/kinsta.com\/se\/blog\/php-vs-javascript\/#typing-of-variables\">st\u00e4lla in och h\u00e4mta odeklarerade klassegenskaper dynamiskt<\/a> i PHP. Till exempel:<\/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>H\u00e4r har klassen <code>Post<\/code> inte deklarerat en <code>name<\/code>-egenskap. Men eftersom PHP till\u00e5ter dynamiska egenskaper s\u00e5 kan du ange den utanf\u00f6r klassdeklarationen. Det \u00e4r dess st\u00f6rsta \u2014 och kanske enda \u2014 f\u00f6rdel.<\/p>\n<p>Dynamiska egenskaper g\u00f6r att ov\u00e4ntade fel och beteenden kan dyka upp i din kod. Om du exempelvis g\u00f6r n\u00e5got misstag n\u00e4r du deklarerar en klassegenskap utanf\u00f6r klassen s\u00e5 \u00e4r det l\u00e4tt att tappa bort den \u2014 s\u00e4rskilt n\u00e4r du fels\u00f6ker eventuella fel inom klassen.<\/p>\n<p>Fr\u00e5n och med PHP 8.2 \u00e4r <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">dynamiska egenskaper f\u00f6rlegade<\/a>. Om du st\u00e4ller in ett v\u00e4rde p\u00e5 en odeklarerad klassegenskap s\u00e5 kommer ett meddelande om avskrivning att skickas ut f\u00f6rsta g\u00e5ngen som egenskapen st\u00e4lls in.<\/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>Fr\u00e5n och med PHP 9.0 och fram\u00e5t kommer dock ett <code>ErrorException<\/code>-fel att uppst\u00e5 n\u00e4r samma egenskap s\u00e4tts.<\/p>\n<p>Om din kod \u00e4r full av dynamiska egenskaper \u2014 och det finns mycket PHP-kod som \u00e4r det \u2014 och du vill stoppa dessa avskrivningsmeddelanden efter uppgradering till PHP 8.2 s\u00e5 kan du anv\u00e4nda PHP 8.2:s nya attribut <code>#[AllowDynamicProperties]<\/code> f\u00f6r att till\u00e5ta dynamiska egenskaper 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>Enligt RFC kan klasser som \u00e4r markerade som <code>#[AllowDynamicProperties]<\/code>, liksom deras underklasser, forts\u00e4tta att anv\u00e4nda dynamiska egenskaper utan att avskrivning eller borttagning sker.<\/p>\n<p>Du b\u00f6r \u00e4ven notera att i PHP 8.2 \u00e4r <code>stdClass<\/code> den enda klass som \u00e4r markerad som <code>#[AllowDynamicProperties]<\/code>. Egenskaper som n\u00e5s med hj\u00e4lp av <code>__get()<\/code> eller <code>__set()<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\">magiska PHP-metoder<\/a> betraktas inte som dynamiska egenskaper, vilket inneb\u00e4r att de inte kommer att ge upphov till ett meddelande om avskrivning.<\/p>\n<h3>Avskriv delvis st\u00f6dda Callables<\/h3>\n<p>En annan \u00e4ndring i PHP 8.2, om \u00e4n med en mer f\u00f6rsumbar inverkan, \u00e4r att <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">delvis st\u00f6dda callables inte l\u00e4ngre \u00e4r till\u00e5tna<\/a>.<\/p>\n<p>Dessa callables kallas delvis st\u00f6dda eftersom du inte kan interagera med dem direkt via <code>$callable()<\/code>. Du kan endast komma \u00e5t dem med funktionen <code>call_user_func($callable)<\/code>. F\u00f6rteckningen \u00f6ver s\u00e5dana callables \u00e4r inte l\u00e5ng:<\/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>Fr\u00e5n och med PHP 8.2 och fram\u00e5t s\u00e5 kommer alla f\u00f6rs\u00f6k att anropa s\u00e5dana callables \u2014 t.ex. via funktionerna <code>call_user_func()<\/code> eller <code>array_map()<\/code> \u2014 att ge en avskrivnings-varning.<\/p>\n<p>I den ursprungliga RFC:n s\u00e5 finns en solid motivering f\u00f6r denna avskrivning:<\/p>\n<blockquote><p><em>Med undantag f\u00f6r de tv\u00e5 sista fallen \u00e4r alla dessa callables kontextberoende. Den metod som <code>\"self::method\"<\/code> h\u00e4nvisar till beror p\u00e5 vilken klass som anropet eller kontrollen av anropbarhet utf\u00f6rs ifr\u00e5n. I praktiken g\u00e4ller detta vanligtvis \u00e4ven f\u00f6r de tv\u00e5 sista fallen, n\u00e4r de anv\u00e4nds i form av <code>[new Foo, \"parent::method\"]<\/code>.<\/em><\/p>\n<p><em>Att minska kontextberoendet f\u00f6r callables \u00e4r det sekund\u00e4ra m\u00e5let f\u00f6r detta RFC. Efter detta RFC \u00e4r det enda scope-beroende som \u00e5terst\u00e5r synlighet av metoder: <code>\"Foo::bar\"<\/code> kan vara synlig i ett scope, men inte i ett annat. Om callables skulle begr\u00e4nsas till offentliga metoder i framtiden (medan privata metoder skulle beh\u00f6va anv\u00e4nda f\u00f6rstklassiga callables eller <code>Closure::fromCallable()<\/code> f\u00f6r att bli scope-oberoende), skulle callable-typen bli v\u00e4ldefinierad och kunna anv\u00e4ndas som en egenskapstyp. <\/em><em>\u00c4ndringar av synlighetshanteringen f\u00f6resl\u00e5s dock inte som en del av detta RFC.<\/em><\/p><\/blockquote>\n<p>I enlighet med ursprungligt RFC s\u00e5 kommer funktionen <code>is_callable()<\/code> och typen <code>callable<\/code> att forts\u00e4tta att acceptera dessa callables som undantag. Men bara tills st\u00f6det f\u00f6r dem tas bort helt och h\u00e5llet fr\u00e5n och med PHP 9.0.<\/p>\n<p>F\u00f6r att undvika f\u00f6rvirring ut\u00f6kades till\u00e4mpningsomr\u00e5det f\u00f6r detta avskrivningsmeddelande <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">med ett nytt RFC<\/a> \u2014 det omfattar nu \u00e4ven dessa undantag.<\/p>\n<p>Det \u00e4r bra att se att PHP r\u00f6r sig mot att ha en v\u00e4ldefinierad<code>callable<\/code>-typ.<\/p>\n<h3>Avskaffa funktionerna <code>#utf8_encode()<\/code> och <code>utf8_decode()<\/code><\/h3>\n<p>PHP:s inbyggda funktioner <code>utf8_encode()<\/code> och <code>utf8_decode()<\/code> konverterar str\u00e4ngar som \u00e4r kodade i ISO-8859-1 (&#8221;Latin 1&#8221;) till och fr\u00e5n UTF-8.<\/p>\n<p>Deras namn antyder dock en mer allm\u00e4n anv\u00e4ndning \u00e4n vad deras implementering till\u00e5ter. Kodningen &#8221;Latin 1&#8221; f\u00f6rv\u00e4xlas ofta med andra kodningar som &#8221;Windows Code Page 1252.&#8221;<\/p>\n<p>Du ser dessutom vanligtvis <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a> n\u00e4r dessa funktioner inte kan konvertera en str\u00e4ng korrekt. Avsaknaden av felmeddelanden inneb\u00e4r \u00e4ven att det \u00e4r sv\u00e5rt att uppt\u00e4cka dem, s\u00e4rskilt i ett hav av annars l\u00e4sbar text.<\/p>\n<p>PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">avvecklar b\u00e5de funktionerna <code>#utf8_encode()<\/code> och <code>utf8_decode()<\/code><\/a>. Om du anropar dem kommer du att m\u00f6ta dessa avskrivningsmeddelanden:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>RFC f\u00f6resl\u00e5r att du ist\u00e4llet anv\u00e4nder <a href=\"https:\/\/kinsta.com\/se\/blog\/installerar-php\/#all-about-php-extensions\">PHP:s st\u00f6dda till\u00e4gg<\/a> som <code>mbstring<\/code>, <code>iconv<\/code> och <code>intl<\/code>.<\/p>\n<h3>F\u00f6rutse <code>${}<\/code> Str\u00e4ng Interpolation<\/h3>\n<p>PHP till\u00e5ter inb\u00e4ddning av variabler i str\u00e4ngar med dubbla citattecken (<code>\"<\/code>) och heredoc (<code>&lt;&lt;&lt;<\/code>) p\u00e5 flera olika s\u00e4tt:<\/p>\n<ol>\n<li>Direkt inb\u00e4ddning av variabler \u2014 <code>\u201c$foo\u201d<\/code><\/li>\n<li>Med hakparenteser utanf\u00f6r variabeln \u2014 <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Med hakparenteser efter dollartecknet \u2014 <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Variabelvariabler \u2014 <code>\u201c${expr}\u201d<\/code> \u2014 motsvarar att anv\u00e4nda <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>De tv\u00e5 f\u00f6rsta s\u00e4tten har sina f\u00f6r- och nackdelar, medan de tv\u00e5 sistn\u00e4mnda har en komplex och motstridig syntax. I PHP 8.2 \u00e4r <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">de tv\u00e5 sista s\u00e4tten f\u00f6r interpolation av str\u00e4ngar \u00f6verspelade<\/a>.<\/p>\n<p>Du b\u00f6r undvika att interpolera str\u00e4ngar p\u00e5 detta s\u00e4tt fram\u00f6ver:<\/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>Fr\u00e5n och med PHP 9.0 s\u00e5 kommer dessa avskrivningar att uppgraderas till att kasta ett undantagsfel.<\/p>\n<h3>F\u00f6rutse mbstring-funktioner f\u00f6r Base64\/QPrint\/Uuencode\/HTML-enheter<\/h3>\n<p>PHP:s mbstring-funktioner (multi-byte string) hj\u00e4lper oss att arbeta med Unicode, HTML-enheter och andra \u00e4ldre textkodningar.<\/p>\n<p>Base64, Uuencode och QPrint \u00e4r dock inte textkodningar och \u00e4r fortfarande en del av dessa funktioner \u2014 fr\u00e4mst av \u00e4ldre sk\u00e4l. PHP inneh\u00e5ller \u00e4ven separata implementeringar av dessa kodningar.<\/p>\n<p>N\u00e4r det g\u00e4ller HTML-enheter s\u00e5 har PHP inbyggda funktioner &#8211; <code>htmlspecialchars()<\/code> och <code>htmlentities()<\/code> \u2014 f\u00f6r att hantera dessa b\u00e4ttre. Till skillnad fr\u00e5n mbstring konverterar dessa funktioner exempelvis \u00e4ven <code>&lt;<\/code>. <code>&gt;<\/code>, och <code>&<\/code>-tecken till HTML-enheter.<\/p>\n<p>Dessutom f\u00f6rb\u00e4ttrar PHP st\u00e4ndigt sina inbyggda funktioner \u2014 <a href=\"https:\/\/kinsta.com\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">precis som PHP 8.1 med HTML-kodnings- och avkodningsfunktioner<\/a>.<\/p>\n<p>S\u00e5 med allt detta i \u00e5tanke <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">avvecklar<\/a> PHP 8.2 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">anv\u00e4ndningen av mbstring f\u00f6r dessa kodningar<\/a> (etiketterna \u00e4r inte skiftl\u00e4gesk\u00e4nsliga):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (alias f\u00f6r HTML-ENTITIES)<\/li>\n<li>Citat och utskrift<\/li>\n<li>qprint<\/li>\n<\/ul>\n<p>Fr\u00e5n och med PHP 8.2 och fram\u00e5t s\u00e5 kommer anv\u00e4ndningen av mbstring f\u00f6r att koda\/avkoda n\u00e5got av ovanst\u00e5ende att ge upphov till ett meddelande om avveckling. PHP 9.0 kommer att ta bort st\u00f6det f\u00f6r mbstring f\u00f6r dessa kodningar helt och h\u00e5llet.<\/p>\n<h2>Andra mindre \u00e4ndringar i PHP 8.2<\/h2>\n<p>Slutligen kan vi diskutera PHP 8.2:s mindre f\u00f6r\u00e4ndringar, inklusive borttagna egenskaper och funktioner.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Borttaget st\u00f6d f\u00f6r libmysql fr\u00e5n mysqli<\/h3>\n<p>Fr\u00e5n och med nu s\u00e5 till\u00e5ter PHP att b\u00e5de <code>mysqli<\/code> &#8211; och <code>PDO_mysql<\/code>-drivrutiner byggs mot <code>mysqlnd<\/code>&#8211; och <code>libmysql<\/code>-biblioteken. Den standardiserade och rekommenderade drivrutinen sedan PHP 5.4 har dock varit <code>mysqlnd<\/code>.<\/p>\n<p>B\u00e5da dessa drivrutiner har m\u00e5nga f\u00f6rdelar och nackdelar. Att ta bort st\u00f6det f\u00f6r en av dem \u2014 helst <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\">ta bort <code>libmysql<\/code><\/a> eftersom den inte \u00e4r standard &#8211; kommer dock att f\u00f6renkla PHP:s kod och enhetstester.<\/p>\n<p>F\u00f6r att argumentera f\u00f6r denna f\u00f6rdel listar RFC m\u00e5nga f\u00f6rdelar med <code>mysqlnd<\/code>:<\/p>\n<ul>\n<li>Det ing\u00e5r i PHP<\/li>\n<li>Den anv\u00e4nder PHP:s minneshantering f\u00f6r att \u00f6vervaka minnesanv\u00e4ndning och<br \/>\n<a href=\"https:\/\/kinsta.com\/se\/blog\/laravel-prestanda\/\">f\u00f6rb\u00e4ttra prestandan<\/a><\/li>\n<li>Ger funktioner f\u00f6r livskvalitet (t.ex. <code>get_result()<\/code>)<\/li>\n<li>\u00c5terger numeriska v\u00e4rden med hj\u00e4lp av PHP:s inhemska typer<\/li>\n<li>Dess funktionalitet \u00e4r inte beroende av det externa biblioteket<\/li>\n<li>Valfri funktionalitet f\u00f6r plugins<\/li>\n<li>St\u00f6djer asynkrona fr\u00e5gor<\/li>\n<\/ul>\n<p>RFC listar \u00e4ven n\u00e5gra f\u00f6rdelar med <code>libmysql<\/code>, bland annat:<\/p>\n<ul>\n<li>Det \u00e4r m\u00f6jligt med automatisk \u00e5terkoppling (<code>mysqlnd<\/code> st\u00f6der inte denna funktionalitet avsiktligt eftersom den l\u00e4tt kan utnyttjas)<\/li>\n<li>LDAP- och SASL-autentiseringsl\u00e4gen (<code>mysqlnd<\/code> kan snart <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">l\u00e4gga till denna funktion<\/a>)<\/li>\n<\/ul>\n<p>I RFC anges dessutom m\u00e5nga nackdelar med <code>libmysql<\/code> \u2014 inkompatibilitet med PHP:s minnesmodell, m\u00e5nga misslyckade tester, minnesl\u00e4ckor, olika funktioner mellan olika versioner osv.<\/p>\n<p>Med allt detta i \u00e5tanke tog PHP 8.2 bort st\u00f6det f\u00f6r att bygga <code>mysqli<\/code> mot <code>libmysql<\/code>.<\/p>\n<p>Om du vill l\u00e4gga till n\u00e5gon funktionalitet som endast \u00e4r tillg\u00e4nglig med <code>libmysql<\/code> s\u00e5 m\u00e5ste du uttryckligen l\u00e4gga till den i<code> mysqlnd<\/code> som en funktionsbeg\u00e4ran. Du kan inte heller l\u00e4gga till auto-reconnect.<\/p>\n<h3>Lokaloberoende fallkonvertering<\/h3>\n<p>F\u00f6re <a href=\"https:\/\/kinsta.com\/se\/blog\/php-8\/\">PHP 8.0<\/a> \u00e4rvdes PHP:s lokalitet fr\u00e5n systemmilj\u00f6n. Detta kunde dock orsaka problem i vissa fall.<\/p>\n<p>Om du st\u00e4ller in ditt spr\u00e5k n\u00e4r du installerar Linux s\u00e5 kommer detta att st\u00e4lla in l\u00e4mpligt spr\u00e5k f\u00f6r anv\u00e4ndargr\u00e4nssnittet f\u00f6r <a href=\"https:\/\/kinsta.com\/blog\/linux-commands\/\">dess inbyggda kommandon<\/a>. Men det \u00e4ndrar \u00e4ven ov\u00e4ntat hur C-bibliotekets str\u00e4nghanteringsfunktionalitet fungerar.<\/p>\n<p>Om du exempelvis valde spr\u00e5ket &#8221;turkiska&#8221; eller &#8221;kazakiska&#8221; n\u00e4r du installerade Linux, s\u00e5 kommer du att uppt\u00e4cka att om du anropar <code>toupper('i')<\/code> f\u00f6r att f\u00e5 fram dess versalekvivalent, kommer du att f\u00e5 fram det <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">streckade stora I:et<\/a> (U+0130, <code>\u0130<\/code>).<\/p>\n<p>PHP 8.0 stoppade denna anomali genom att st\u00e4lla in standardlokalspr\u00e5ket till &#8221;C&#8221;, s\u00e5vida inte anv\u00e4ndaren uttryckligen \u00e4ndrar det via <code>setlocale()<\/code>.<\/p>\n<p>PHP 8.2 g\u00e5r \u00e4nnu l\u00e4ngre genom att <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">avl\u00e4gsna lokal k\u00e4nslighet fr\u00e5n storleksomvandlingar<\/a>. Detta RFC \u00e4ndrar fr\u00e4mst <code>strtolower()<\/code>, <code>strtoupper()<\/code> och relaterade funktioner. L\u00e4s RFC:n f\u00f6r en lista \u00f6ver alla ber\u00f6rda funktioner.<\/p>\n<p>Om du vill anv\u00e4nda lokalanpassad konvertering av versaler s\u00e5 kan du anv\u00e4nda <code>mb_strtolower()<\/code> som ett alternativ.<\/p>\n<h3>F\u00f6rb\u00e4ttring av slumpm\u00e4ssiga till\u00e4gg<\/h3>\n<p>PHP planerar att <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">se \u00f6ver sin slumpfunktionalitet<\/a>.<\/p>\n<p>F\u00f6r n\u00e4rvarande \u00e4r PHP:s slumpfunktionalitet starkt beroende av <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">Mersenne Twister-tillst\u00e5ndet<\/a>. Detta tillst\u00e5nd lagras dock implicit i PHP:s globala omr\u00e5de \u2014 det finns inget s\u00e4tt f\u00f6r en anv\u00e4ndare att komma \u00e5t det. Att l\u00e4gga till randomiseringsfunktioner mellan det f\u00f6rsta uts\u00e4ttningsstadiet och den avsedda anv\u00e4ndningen skulle bryta koden.<\/p>\n<p>Att underh\u00e5lla en s\u00e5dan kod kan bli \u00e4nnu mer komplicerat n\u00e4r din kod anv\u00e4nder externa paket.<\/p>\n<p>PHP:s nuvarande slumpfunktionalitet kan allts\u00e5 inte reproducera slumpm\u00e4ssiga v\u00e4rden p\u00e5 ett konsekvent s\u00e4tt. Den misslyckas till och med med empiriska statistiska tester av enhetliga slumptalsgeneratorer, som <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">TestU01:s Crush och BigCrush<\/a>. Mersenne Twisters 32-bitarsbegr\u00e4nsning f\u00f6rv\u00e4rrar detta ytterligare.<\/p>\n<p>D\u00e4rf\u00f6r rekommenderas inte anv\u00e4ndningen av PHP:s inbyggda funktioner \u2014 <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> \u2014 om du beh\u00f6ver kryptografiskt s\u00e4kra slumpm\u00e4ssiga tal. I s\u00e5dana fall m\u00e5ste du implementera en ny funktion med hj\u00e4lp av <code>random_int()<\/code> eller liknande funktioner.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">Flera problem med detta RFC<\/a> togs dock upp efter att omr\u00f6stningen hade b\u00f6rjat. Detta bakslag tvingade PHP-teamet att notera alla problem i ett separat RFC, med ett skapat r\u00f6stningsalternativ f\u00f6r varje problem. De kommer att besluta om att g\u00e5 vidare f\u00f6rst n\u00e4r de har n\u00e5tt samf\u00f6rst\u00e5nd.<\/p>\n<h2>Ytterligare RFC:er i PHP 8.2<\/h2>\n<p>PHP 8.2 inneh\u00e5ller \u00e4ven m\u00e5nga nya funktioner och mindre \u00e4ndringar. Vi n\u00e4mner dem nedan med l\u00e4nkar till ytterligare resurser:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Ny funktion p\u00e5 <code>curl_upkeep<\/code><\/a>: PHP 8.2 l\u00e4gger till den h\u00e4r nya funktionen till sitt Curl-till\u00e4gg. Den anropar funktionen <code>curl_easy_upkeep()<\/code> i libcurl, det underliggande C-biblioteket som PHP:s Curl-till\u00e4gg anv\u00e4nder.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Ny funktion <code>ini_parse_quantity<\/code><\/a>: PHP INI-direktiv accepterar datastorlekar med ett multiplikatorsuffix. Du kan exempelvis skriva 25 megabyte som <code>25M<\/code>, eller 42 gigabyte som <code>42G<\/code>. Dessa suffix \u00e4r vanliga i PHP INI-filer men \u00e4r ovanliga p\u00e5 andra st\u00e4llen. Den h\u00e4r nya funktionen analyserar <a href=\"https:\/\/kinsta.com\/se\/blog\/okar-maxstorleken-pa-uppladdningar-i-wordpress\/#create-or-modify-the-phpini-file\">PHP INI-v\u00e4rdena<\/a> och returnerar deras datastorlek i byte.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Ny funktion <code>memory_reset_peak_usage<\/code><\/a>: Den h\u00e4r funktionen \u00e5terst\u00e4ller den h\u00f6gsta minnesanv\u00e4ndningen som returneras av funktionen <code>memory_get_peak_usage<\/code>. Det kan vara praktiskt n\u00e4r du k\u00f6r samma \u00e5tg\u00e4rd flera g\u00e5nger och vill registrera varje k\u00f6rnings h\u00f6gsta minnesanv\u00e4ndning.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">St\u00f6d f\u00f6r modifieringen no-capture (<code>\/n<\/code>) i <code>preg_*<\/code> -funktioner<\/a>: I regex anger metatecknen <code>()<\/code> en f\u00e5ngstgrupp. Det betyder att alla tr\u00e4ffar f\u00f6r uttrycket inom parentesen returneras. PHP 8.2 l\u00e4gger till en no-capture-modifier (<code>\/n<\/code>) f\u00f6r att stoppa detta beteende.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\">G\u00f6r s\u00e5 att <code>iterator_*()<\/code> -familjen accepterar alla iterables<\/a>: F\u00f6r n\u00e4rvarande accepterar PHP:s <code>iterator_*()<\/code>-familj endast <code>Traversables<\/code> (dvs. inga vanliga matriser till\u00e5ts). Detta \u00e4r on\u00f6digt begr\u00e4nsande, och detta RFC \u00e5tg\u00e4rdar detta.<\/li>\n<\/ol>\n<h2>Sammanfattning<\/h2>\n<p>PHP 8.2 bygger vidare p\u00e5 de enorma f\u00f6rb\u00e4ttringarna i PHP 8.0 och PHP 8.1, vilket inte \u00e4r n\u00e5gon l\u00e4tt uppgift. Vi tycker att de mest sp\u00e4nnande funktionerna i PHP 8.2 \u00e4r de nya frist\u00e5ende typerna, de skrivskyddade egenskaperna och de m\u00e5nga prestandaf\u00f6rb\u00e4ttringarna.<\/p>\n<p>Vi kan inte v\u00e4nta p\u00e5 att <a href=\"https:\/\/kinsta.com\/se\/blog\/php-riktmarkena\/\">j\u00e4mf\u00f6ra PHP 8.2<\/a> med olika <a href=\"https:\/\/kinsta.com\/se\/blog\/php-ramverken\/\">PHP-ramverk<\/a> och <a href=\"https:\/\/kinsta.com\/wordpress-market-share\/\">CMS<\/a>.<\/p>\n<p>Se till att bokm\u00e4rka det h\u00e4r blogginl\u00e4gget f\u00f6r framtida referens.<\/p>\n<p><em>Vilka funktioner i PHP 8.2 \u00e4r dina favoriter? Vilka avskrivningar \u00e4r de funktioner som du uppskattar minst? Dela g\u00e4rna med dig av dina tankar till v\u00e5rt community i kommentarerna!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.2 bygger p\u00e5 den f\u00f6rnyade basen fr\u00e5n PHP 8.0 och PHP 8.1. Nu n\u00e4r PHP 8.2 har sl\u00e4ppts, ska vi g\u00e5 igenom vad som \u00e4r &#8230;<\/p>\n","protected":false},"author":117,"featured_media":45771,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[804],"class_list":["post-45770","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-php-uppdateringar"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vad \u00e4r nytt i PHP 8.2 \u2014 Nya Funktioner, Avskrivningar, &amp; \u00c4ndringar<\/title>\n<meta name=\"description\" content=\"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer\" \/>\n<meta property=\"og:description\" content=\"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstasweden\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-20T14:21:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-21T09:26:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/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=\"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer\",\"datePublished\":\"2022-09-20T14:21:24+00:00\",\"dateModified\":\"2023-09-21T09:26:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\"},\"wordCount\":3709,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png\",\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\",\"name\":\"Vad \u00e4r nytt i PHP 8.2 \u2014 Nya Funktioner, Avskrivningar, & \u00c4ndringar\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png\",\"datePublished\":\"2022-09-20T14:21:24+00:00\",\"dateModified\":\"2023-09-21T09:26:37+00:00\",\"description\":\"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/se\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP-uppdateringar\",\"item\":\"https:\/\/kinsta.com\/se\/topics\/php-uppdateringar\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/se\/#website\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/se\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/se\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstasweden\/\",\"https:\/\/x.com\/kinsta_se\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vad \u00e4r nytt i PHP 8.2 \u2014 Nya Funktioner, Avskrivningar, & \u00c4ndringar","description":"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/","og_locale":"sv_SE","og_type":"article","og_title":"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer","og_description":"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.","og_url":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstasweden\/","article_published_time":"2022-09-20T14:21:24+00:00","article_modified_time":"2023-09-21T09:26:37+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.","twitter_image":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_se","twitter_misc":{"Skriven av":"Salman Ravoof","Ber\u00e4knad l\u00e4stid":"17 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer","datePublished":"2022-09-20T14:21:24+00:00","dateModified":"2023-09-21T09:26:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/"},"wordCount":3709,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","inLanguage":"sv-SE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/se\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/","name":"Vad \u00e4r nytt i PHP 8.2 \u2014 Nya Funktioner, Avskrivningar, & \u00c4ndringar","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","datePublished":"2022-09-20T14:21:24+00:00","dateModified":"2023-09-21T09:26:37+00:00","description":"Uppt\u00e4ck vad som \u00e4r nytt i PHP 8.2. Det planeras att sl\u00e4ppas den 24 november, \u00e5r 2022, och medf\u00f6r m\u00e5nga nya funktioner, \u00e4ndringar och mer.","breadcrumb":{"@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/se\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/whats-new-in-php-82.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/se\/blog\/php-8-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/se\/"},{"@type":"ListItem","position":2,"name":"PHP-uppdateringar","item":"https:\/\/kinsta.com\/se\/topics\/php-uppdateringar\/"},{"@type":"ListItem","position":3,"name":"Nyheter i PHP 8.2 \u2014 Nya funktioner, avskrivningar, \u00e4ndringar och mycket mer"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/se\/#website","url":"https:\/\/kinsta.com\/se\/","name":"Kinsta\u00ae","description":"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar","publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/se\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/se\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstasweden\/","https:\/\/x.com\/kinsta_se","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/comments?post=45770"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45770\/revisions"}],"predecessor-version":[{"id":48780,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45770\/revisions\/48780"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/translations\/se"},{"href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45770\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media\/45771"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media?parent=45770"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/tags?post=45770"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/topic?post=45770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}