{"id":53214,"date":"2022-08-11T13:22:54","date_gmt":"2022-08-11T12:22:54","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=53214&#038;preview=true&#038;preview_id=53214"},"modified":"2023-07-27T11:42:43","modified_gmt":"2023-07-27T10:42:43","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/","title":{"rendered":"Was ist neu in PHP 8.2 &#8211; Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr"},"content":{"rendered":"<p>PHP 8.2 baut auf der erneuerten Basis von <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8\/\">PHP 8.0<\/a> und <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/\">PHP 8.1<\/a> auf. Jetzt, wo <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a> ver\u00f6ffentlicht wurde, wollen wir uns die Neuerungen in PHP 8.2 im Detail ansehen &#8211; von den neuen Funktionen und Verbesserungen bis hin zu Verwerfungen und kleineren \u00c4nderungen gehen wir alles durch.<\/p>\n<p>Da PHP 8.2 am 19. Juli 2022 eingefroren wurde, sind in dieser Liste keine wesentlichen Neuerungen zu erwarten.<\/p>\n<p>Aufgeregt? Wir sind es auch.<\/p>\n<p>Los geht&#8217;s!<\/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>Neue Funktionen und Verbesserungen in PHP 8.2<\/h2>\n<p>Beginnen wir damit, alle neuen Funktionen von PHP 8.2 kennenzulernen. Die Liste ist ziemlich umfangreich:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Neue <code>readonly<\/code> Klassen<\/h3>\n<p>Mit PHP 8.1 wurde die <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/#new-readonly-properties\">Funktion<code>readonly<\/code> f\u00fcr Klasseneigenschaften<\/a> eingef\u00fchrt. Mit PHP 8.2 wird nun die M\u00f6glichkeit hinzugef\u00fcgt, <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">die gesamte Klasse als <code>readonly<\/code> zu deklarieren.<\/a><\/p>\n<p>Wenn du eine Klasse als <code>readonly<\/code> deklarierst, erben alle ihre Eigenschaften automatisch das <code>readonly<\/code> Merkmal. Wenn du also eine Klasse <code>readonly<\/code> deklarierst, ist es dasselbe, als wenn du jede Klasseneigenschaft als <code>readonly<\/code> deklarierst.<\/p>\n<p>Mit PHP 8.1 musstest du zum Beispiel diesen m\u00fchsamen Code schreiben, um alle Klasseneigenschaften als <code>readonly<\/code> zu deklarieren:<\/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>Stell dir das Gleiche mit vielen weiteren Eigenschaften vor. Jetzt, mit PHP 8.2, kannst du einfach Folgendes schreiben:<\/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 kannst auch abstrakte oder finale Klassen als <code>readonly<\/code> deklarieren. Dabei spielt die Reihenfolge der Schl\u00fcsselw\u00f6rter keine Rolle.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Du kannst auch eine <code>readonly<\/code> Klasse ohne Eigenschaften deklarieren. Dadurch werden dynamische Eigenschaften verhindert, w\u00e4hrend die untergeordneten Klassen ihre <code>readonly<\/code> Eigenschaften explizit deklarieren k\u00f6nnen.<\/p>\n<p>Als N\u00e4chstes k\u00f6nnen <code>readonly<\/code> Klassen nur typisierte Eigenschaften enthalten &#8211; die gleiche Regel gilt f\u00fcr die Deklaration einzelner <strong>schreibgesch\u00fctzter<\/strong> Eigenschaften.<\/p>\n<p>Du kannst die <code>mixed<\/code> type-Eigenschaft verwenden, wenn du keine streng typisierte Eigenschaft deklarieren kannst.<\/p>\n<p>Der Versuch, eine <code>readonly<\/code> Klasse ohne typisierte Eigenschaft zu deklarieren, f\u00fchrt zu einem fatalen Fehler:<\/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>Au\u00dferdem kannst du <code>readonly<\/code> nicht f\u00fcr bestimmte PHP-Funktionen deklarieren:<\/p>\n<ul>\n<li><strong>Enums <\/strong>(da <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/#enums\">sie keine Eigenschaft enthalten k\u00f6nnen<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Interfaces<\/strong><\/li>\n<\/ul>\n<p>Der Versuch, eine dieser Funktionen als <code>readonly<\/code> zu deklarieren, f\u00fchrt zu einem Parse-Fehler.<\/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>Wie bei allen PHP-Schl\u00fcsselw\u00f6rtern ist auch beim Schl\u00fcsselwort <code>readonly<\/code> die Gro\u00df- und Kleinschreibung egal.<\/p>\n<p>Mit PHP 8.2 werden auch dynamische Eigenschaften verworfen (mehr dazu sp\u00e4ter). Du kannst jedoch nicht verhindern, dass dynamische Eigenschaften zu einer Klasse hinzugef\u00fcgt werden. Wenn du dies jedoch f\u00fcr eine Klasse <code>readonly<\/code> tust, f\u00fchrt das nur zu einem 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><code>true<\/code>, <code>false<\/code>, und <code>null<\/code> als eigenst\u00e4ndige Typen zulassen<\/h3>\n<p>PHP enth\u00e4lt bereits skalare Typen wie <code>int<\/code>, <code>string<\/code> und <code>bool<\/code>. Diese wurden in PHP 8.0 um <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8\/#union-types-2-0\">Union-Typen<\/a> erweitert, die es erm\u00f6glichen, dass Werte von verschiedenen Typen sein k\u00f6nnen. Der gleiche RFC erlaubte auch die Verwendung von <code>false<\/code> und <code>null<\/code> als Teil eines Union-Typs &#8211; als eigenst\u00e4ndige Typen waren sie jedoch nicht erlaubt.<\/p>\n<p>Wenn du versucht hast, <code>false<\/code> oder <code>null<\/code> als eigenst\u00e4ndige Typen zu deklarieren &#8211; ohne dass sie Teil eines Union-Typs sind -, kam es zu einem fatalen Fehler.<\/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>Um dieses Szenario zu vermeiden, unterst\u00fctzt PHP 8.2 nun die Verwendung von <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> und <code>null<\/code><\/a> als eigenst\u00e4ndige Typen. Damit wird das PHP-Typensystem noch aussagekr\u00e4ftiger und vollst\u00e4ndiger. Du kannst nun R\u00fcckgabe-, Parameter- und Eigenschaftstypen genau deklarieren.<\/p>\n<p>Au\u00dferdem gab es in PHP immer noch keinen Typ <code>true<\/code>, der ein nat\u00fcrliches Gegenst\u00fcck zum Typ <code>false<\/code> zu sein schien. PHP 8.2 behebt dies und <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">unterst\u00fctzt auch den Typ <code>true<\/code> <\/a>. Er erlaubt keinen Zwang, genau wie der Typ <code>false<\/code>.<\/p>\n<p>Die beiden Typen <code>true<\/code> und <code>false<\/code> sind im Wesentlichen ein Unionstyp des PHP-Typs <code>bool<\/code>. Um Redundanz zu vermeiden, kannst du diese drei Typen nicht zusammen in einem Unionstyp deklarieren. Wenn du das tust, f\u00fchrt das zu einem fatalen Kompilierfehler.<\/p>\n<h3>Disjunctive Normal Form (DNF) Typen<\/h3>\n<p>Die <a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">disjunktive Normalform (DNF)<\/a> ist eine standardisierte Methode, um boolesche Ausdr\u00fccke zu organisieren. Sie besteht aus einer Disjunktion von Konjunktionen &#8211; in booleschen Begriffen ist das ein <strong>ODER von UNDs<\/strong>.<\/p>\n<p>Die Anwendung von DNF auf Typendeklarationen erm\u00f6glicht eine standardisierte Art und Weise, kombinierte Union- und <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/#pure-intersection-types\">Intersection-Typen<\/a> zu schreiben, die der Parser verarbeiten kann. Die <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">neue DNF-Typenfunktion<\/a> von PHP 8.2 ist einfach, aber m\u00e4chtig, wenn sie richtig eingesetzt wird.<\/p>\n<p>Der RFC gibt das folgende Beispiel. Es geht davon aus, dass die folgenden Schnittstellen- und Klassendefinitionen bereits existieren:<\/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>Mit DNF-Typen kannst du Typdeklarationen f\u00fcr Eigenschaften, Parameter und R\u00fcckgabewerte wie folgt vornehmen:<\/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>In manchen F\u00e4llen k\u00f6nnen die Eigenschaften nicht in DNF-Form vorliegen. Wenn du sie als solche deklarierst, f\u00fchrt das zu einem Parse-Fehler. Du kannst sie aber jederzeit umschreiben als:<\/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 solltest beachten, dass jedes Segment eines DNF-Typs eindeutig sein muss. So ist zum Beispiel die Deklaration <code>(A&B)|(B&A)<\/code> ung\u00fcltig, da die beiden <strong>ODER-verkn\u00fcpften <\/strong>Segmente logisch gleich sind.<\/p>\n<p>Au\u00dferdem sind Segmente, die strenge Teilmengen des anderen Segments sind, ebenfalls nicht zul\u00e4ssig. Das liegt daran, dass die Obermenge bereits alle Instanzen der Untermenge enth\u00e4lt, so dass es \u00fcberfl\u00fcssig ist, DNF zu verwenden.<\/p>\n<h3>Sensible Parameter in Backtraces redacten<\/h3>\n<p>Wie fast jede <a href=\"https:\/\/kinsta.com\/de\/blog\/beste-programmiersprache-lernen-sollte\/\">Programmiersprache<\/a> erlaubt auch <a href=\"https:\/\/kinsta.com\/php\/\">PHP<\/a> die Nachverfolgung des Aufrufstapels an jedem Punkt der Codeausf\u00fchrung. Das Stack-Tracing erleichtert das Debuggen von Code, um Fehler und Leistungsengp\u00e4sse zu beheben. Es bildet das R\u00fcckgrat von Tools wie <a href=\"https:\/\/kinsta.com\/de\/apm-tool\/\">Kinsta APM<\/a>, unserem ma\u00dfgeschneiderten <a href=\"https:\/\/kinsta.com\/de\/blog\/application-performance-monitoring\/\">Performance-Monitoring-Tool<\/a> f\u00fcr WordPress-Sites.<\/p>\n<figure id=\"attachment_53296\" aria-describedby=\"caption-attachment-53296\" style=\"width: 1093px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-53296 size-full\" src=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-de-1.png\" alt=\"Langsame WooCommerce-Transaktionen mit Kinsta APM aufsp\u00fcren\" width=\"1093\" height=\"659\" srcset=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-de-1.png 1093w, https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-de-1-300x181.png 300w, https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-de-1-1024x617.png 1024w, https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-de-1-768x463.png 768w\" sizes=\"auto, (max-width: 1093px) 100vw, 1093px\" \/><figcaption id=\"caption-attachment-53296\" class=\"wp-caption-text\">Langsame WooCommerce-Transaktionen mit Kinsta APM aufsp\u00fcren<\/figcaption><\/figure>\n<p>Wenn du einen Stack Trace durchf\u00fchrst, h\u00e4ltst du die Ausf\u00fchrung des Programms nicht an. Normalerweise laufen die meisten Stack Traces im Hintergrund und werden stillschweigend protokolliert &#8211; f\u00fcr eine sp\u00e4tere \u00dcberpr\u00fcfung, falls n\u00f6tig.<\/p>\n<p>Einige dieser detaillierten PHP-Stacktraces k\u00f6nnen jedoch von Nachteil sein, wenn du sie an Drittanbieterdienste weitergibst &#8211; in der Regel f\u00fcr die <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-fehlerprotokolle\/\">Analyse von Fehlerprotokollen<\/a>, die Fehlerverfolgung usw. Diese Stack Traces k\u00f6nnen sensible Informationen wie Benutzernamen, Passw\u00f6rter und Umgebungsvariablen enthalten.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">Dieser RFC-Vorschlag<\/a> gibt ein solches Beispiel:<\/p>\n<blockquote><p>Ein h\u00e4ufiger &#8222;\u00dcbelt\u00e4ter&#8220; ist PDO, das das Datenbankpasswort als Konstruktorparameter annimmt und sofort versucht, sich innerhalb des Konstruktors mit der Datenbank zu verbinden, anstatt einen reinen Konstruktor und eine <strong>separate -&gt;connect()<\/strong> Methode zu haben. Wenn die Datenbankverbindung fehlschl\u00e4gt, enth\u00e4lt der Stack-Trace das Datenbankpasswort:<\/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>Mit PHP 8.2 kannst du <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">solche sensiblen Parameter<\/a> mit dem neuen Attribut <code>\\SensitiveParameter<\/code> kennzeichnen. Jeder Parameter, der als sensibel gekennzeichnet ist, wird in deinen Backtraces nicht aufgef\u00fchrt. So kannst du sie bedenkenlos an Drittanbieterdienste weitergeben.<\/p>\n<p>Hier ist ein einfaches Beispiel mit einem einzigen sensiblen 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>Wenn du einen Backtrace erstellst, wird jeder Parameter mit dem Attribut <code>\\SensitiveParameter<\/code> durch ein <code>\\SensitiveParameterValue<\/code> Objekt ersetzt, und sein tats\u00e4chlicher Wert wird nie im Trace gespeichert. Das <code>SensitiveParameterValue<\/code> Objekt kapselt den tats\u00e4chlichen Parameterwert ein &#8211; falls du ihn aus irgendeinem Grund ben\u00f6tigst.<\/p>\n<h3>Neue <code>mysqli_execute_query<\/code> Funktion und <code>mysqli::execute_query<\/code> Methode<\/h3>\n<p>Hast du jemals die Funktion <code>mysqli_query()<\/code> mit gef\u00e4hrlich ausbrechenden Benutzerwerten verwendet, nur um eine parametrisierte MySQLi-Abfrage auszuf\u00fchren?<\/p>\n<p>PHP 8.2 macht das <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">Ausf\u00fchren von parametrisierten MySQLi-Abfragen<\/a> mit der neuen Funktion <code>mysqli_execute_query($sql, $params)<\/code> und der Methode <code>mysqli::execute_query<\/code> einfacher.<\/p>\n<p>Im Wesentlichen ist diese neue Funktion eine Kombination aus den Funktionen <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code> und <code>mysqli_stmt_get_result()<\/code>. Mit ihr wird die MySQLi-Abfrage vorbereitet, gebunden (falls du Parameter \u00fcbergeben hast) und innerhalb der Funktion selbst ausgef\u00fchrt. Wenn die Abfrage erfolgreich ausgef\u00fchrt wird, gibt sie ein <code>mysqli_result<\/code> Objekt zur\u00fcck. Wenn sie nicht erfolgreich war, wird <code>false<\/code> zur\u00fcckgegeben.<\/p>\n<p>Der RFC-Vorschlag enth\u00e4lt ein einfaches, aber aussagekr\u00e4ftiges Beispiel:<\/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>Abrufen von <code>enum<\/code> Eigenschaften in <code>const<\/code> Ausdr\u00fccken<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">Dieser RFC schl\u00e4gt vor<\/a>\u00a0dem <code>-&gt;\/?-&gt;<\/code> Operator zu erlauben <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a> Eigenschaften in <code>const<\/code> Ausdr\u00fccken abzurufen.<\/p>\n<p>Der Hauptgrund f\u00fcr diese neue Funktion ist, dass du <code>enum<\/code> Objekte an einigen Stellen nicht verwenden kannst, z. B. bei Array-Schl\u00fcsseln. In einem solchen Fall musst du den Wert des <code>enum<\/code> Falls wiederholen, um ihn zu verwenden.<\/p>\n<p>Das Abrufen von <code>enum<\/code> Eigenschaften an Stellen, an denen <code>enum<\/code> Objekte nicht erlaubt sind, kann dieses Verfahren vereinfachen.<\/p>\n<p>Das bedeutet, dass der folgende Code jetzt g\u00fcltig ist:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>Und um auf Nummer sicher zu gehen, enth\u00e4lt dieser RFC auch Unterst\u00fctzung f\u00fcr den Nullsafe-Operator <code>?-&gt;<\/code>.<\/p>\n<h3>Konstanten in Traits zulassen<\/h3>\n<p>PHP bietet eine M\u00f6glichkeit zur Wiederverwendung von Code, die Traits. Sie sind ideal f\u00fcr die Wiederverwendung von Code in verschiedenen Klassen.<\/p>\n<p>Derzeit k\u00f6nnen in Traits nur Methoden und Eigenschaften, aber keine Konstanten definiert werden. Das bedeutet, dass du keine Invarianten, die von einem Trait erwartet werden, innerhalb des Traits selbst definieren kannst. Um diese Einschr\u00e4nkung zu umgehen, musst du Konstanten in der komponierenden Klasse oder in einer Schnittstelle definieren, die von der komponierenden Klasse implementiert wird.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">In diesem RFC wird vorgeschlagen<\/a>, die Definition von Konstanten in Traits zu erm\u00f6glichen. Diese Konstanten k\u00f6nnen genauso definiert werden, wie du Klassen-Konstanten definieren w\u00fcrdest. Dieses Beispiel, das direkt aus dem RFC entnommen wurde, verdeutlicht die Verwendung der Konstanten:<\/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-Konstanten werden in die Definition der zusammensetzenden Klasse integriert, genau wie die Definitionen der Eigenschaften und Methoden eines Traits. Sie haben auch \u00e4hnliche Einschr\u00e4nkungen wie die Eigenschaften von Traits. Wie im RFC erw\u00e4hnt, ist dieser Vorschlag zwar ein guter Anfang, muss aber noch weiter ausgearbeitet werden, um die Funktion zu vervollst\u00e4ndigen.<\/p>\n<h2>Verwerfungen in PHP 8.2<\/h2>\n<p>Jetzt k\u00f6nnen wir uns mit den Verwerfungen in PHP 8.2 befassen. Die Liste ist nicht ganz so umfangreich wie die der neuen Funktionen:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Veraltete dynamische Eigenschaften (und das neue Attribut <code>#[AllowDynamicProperties]<\/code> )<\/h3>\n<p>Bis zu PHP 8.1 konntest du in PHP <a href=\"https:\/\/kinsta.com\/de\/blog\/php-vs-javascript\/#typing-of-variables\">nicht deklarierte Klasseneigenschaften dynamisch setzen und abrufen<\/a>. Zum Beispiel:<\/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>Hier deklariert die Klasse <code>Post<\/code> keine Eigenschaft <code>name<\/code>. Da PHP aber dynamische Eigenschaften erlaubt, kannst du sie au\u00dferhalb der Klassendeklaration setzen. Das ist der gr\u00f6\u00dfte &#8211; und vielleicht auch einzige &#8211; Vorteil der Klasse.<\/p>\n<p>Mit dynamischen Eigenschaften k\u00f6nnen unerwartete Fehler und Verhaltensweisen in deinem Code auftauchen. Wenn du zum Beispiel bei der Deklaration einer Klasseneigenschaft au\u00dferhalb der Klasse einen Fehler machst, kannst du sie leicht aus den Augen verlieren &#8211; vor allem bei der Fehlersuche innerhalb der Klasse.<\/p>\n<p>Ab PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">sind dynamische Eigenschaften veraltet<\/a>. Wenn du einer nicht deklarierten Klasseneigenschaft einen Wert zuweist, wird beim ersten Setzen der Eigenschaft ein Hinweis auf die Verwerfung ausgegeben.<\/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>Ab PHP 9.0 wird beim Setzen einer solchen Eigenschaft jedoch ein <code>ErrorException<\/code> Fehler ausgegeben.<\/p>\n<p>Wenn dein Code voller dynamischer Eigenschaften ist &#8211; und das ist in vielen PHP-Codes der Fall &#8211; und wenn du diese Verfallsmeldungen nach dem Upgrade auf PHP 8.2 vermeiden willst, kannst du das neue Attribut <code>#[AllowDynamicProperties]<\/code> von PHP 8.2 verwenden, um dynamische Eigenschaften f\u00fcr Klassen zuzulassen.<\/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>Laut RFC k\u00f6nnen Klassen, die als <code>#[AllowDynamicProperties]<\/code> gekennzeichnet sind, sowie ihre Unterklassen weiterhin dynamische Eigenschaften verwenden, ohne dass sie veraltet sind oder entfernt werden.<\/p>\n<p>Du solltest auch beachten, dass in PHP 8.2 die einzige geb\u00fcndelte Klasse, die als <code>#[AllowDynamicProperties]<\/code> gekennzeichnet ist, <code>stdClass<\/code> ist. Au\u00dferdem gelten alle Eigenschaften, auf die \u00fcber die <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\">PHP-Magic-Methoden<\/a> <code>__get()<\/code> oder <code>__set()<\/code> zugegriffen wird, nicht als dynamische Eigenschaften, so dass sie keinen Hinweis auf die Veralterung ausl\u00f6sen.<\/p>\n<h3>Teilweise unterst\u00fctzte Callables verwerfen<\/h3>\n<p>Eine weitere \u00c4nderung in PHP 8.2, wenn auch mit geringeren Auswirkungen, ist die <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">Abschaffung von teilweise unterst\u00fctzten Callables<\/a>.<\/p>\n<p>Diese Callables werden als teilweise unterst\u00fctzt bezeichnet, weil du sie nicht direkt \u00fcber <code>$callable()<\/code> ansprechen kannst. Du kannst sie nur \u00fcber die Funktion <code>call_user_func($callable)<\/code> erreichen. Die Liste solcher Callables ist nicht 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>Ab PHP 8.2 wird jeder Versuch, solche Callables aufzurufen &#8211; z. B. \u00fcber die Funktionen <code>call_user_func()<\/code> oder <code>array_map()<\/code> &#8211; eine Deprecation-Warnung ausl\u00f6sen.<\/p>\n<p>Der urspr\u00fcngliche RFC liefert eine solide Begr\u00fcndung f\u00fcr diese Verwerfung:<\/p>\n<blockquote><p><em>Abgesehen von den letzten beiden F\u00e4llen sind alle diese Callables kontextabh\u00e4ngig. Die Methode, auf die sich <code>\"self::method\"<\/code> bezieht, h\u00e4ngt davon ab, von welcher Klasse aus der Aufruf oder die Pr\u00fcfung der Aufrufbarkeit durchgef\u00fchrt wird. In der Praxis gilt dies in der Regel auch f\u00fcr die letzten beiden F\u00e4lle, wenn sie in der Form von <code>[new Foo, \"parent::method\"]<\/code> verwendet werden.<\/em><\/p>\n<p><em>Die Verringerung der Kontextabh\u00e4ngigkeit von Callables ist das zweite Ziel dieses RFC. Nach diesem RFC bleibt nur noch die Sichtbarkeit von Methoden \u00fcbrig: <code>\"Foo::bar\"<\/code> kann in einem Bereich sichtbar sein, in einem anderen aber nicht. Wenn Callables in Zukunft auf \u00f6ffentliche Methoden beschr\u00e4nkt w\u00fcrden (w\u00e4hrend private Methoden Callables erster Klasse oder <code>Closure::fromCallable()<\/code> verwenden m\u00fcssten, um scope-unabh\u00e4ngig zu sein), dann w\u00e4re der Callable-Typ klar definiert und k\u00f6nnte als Eigenschaftstyp verwendet werden.<\/em><em>\u00c4nderungen an der Handhabung der Sichtbarkeit werden in diesem RFC jedoch nicht vorgeschlagen<\/em><\/p><\/blockquote>\n<p>.<br \/>\nWie im urspr\u00fcnglichen RFC vorgesehen, werden die Funktion <code>is_callable()<\/code> und der Typ <code>callable<\/code> diese Callables weiterhin als Ausnahmen akzeptieren. Allerdings nur so lange, bis die Unterst\u00fctzung f\u00fcr sie ab PHP 9.0 vollst\u00e4ndig entfernt wird.<\/p>\n<p>Um Verwirrung zu vermeiden, wurde der Geltungsbereich der Verwerfungsmitteilung <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">mit einem neuen RFC erweitert<\/a> &#8211; er umfasst nun auch diese Ausnahmen.<\/p>\n<p>Es ist gut zu sehen, dass sich PHP in Richtung eines klar definierten <code>callable<\/code> Typs bewegt.<\/p>\n<h3>Ablehnung der Funktionen <code>#utf8_encode()<\/code> und <code>utf8_decode()<\/code><\/h3>\n<p>Die in PHP eingebauten Funktionen <code>utf8_encode()<\/code> und <code>utf8_decode()<\/code> konvertieren Strings, die in ISO-8859-1 (&#8222;Latin 1&#8220;) kodiert sind, in und aus UTF-8.<\/p>\n<p>Ihre Namen deuten jedoch auf eine allgemeinere Verwendung hin, als ihre Implementierung zul\u00e4sst. Die Kodierung &#8222;Latin 1&#8220; wird h\u00e4ufig mit anderen Kodierungen wie der &#8222;Windows Code Page 1252&#8220; verwechselt<\/p>\n<p>Au\u00dferdem siehst du in der Regel <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a>, wenn diese Funktionen einen String nicht richtig umwandeln k\u00f6nnen. Das Fehlen von Fehlermeldungen bedeutet auch, dass es schwierig ist, sie zu erkennen, besonders in einem Meer von ansonsten lesbarem Text.<\/p>\n<p>In PHP 8.2 sind die <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">Funktionen <code>#utf8_encode()<\/code> und <code>utf8_decode()<\/code> veraltet<\/a>. Wenn du sie aufrufst, siehst du diese Hinweise zur Veraltung:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>Der RFC empfiehlt, stattdessen die von <a href=\"https:\/\/kinsta.com\/de\/blog\/installiert-php\/#all-about-php-extensions\">PHP unterst\u00fctzten Erweiterungen<\/a> wie <code>mbstring<\/code>, <code>iconv<\/code> und <code>intl<\/code> zu verwenden.<\/p>\n<h3>Verwerfung der <code>${}<\/code> String-Interpolation<\/h3>\n<p>PHP erlaubt das Einbetten von Variablen in Strings mit doppelten Anf\u00fchrungszeichen (<code>\"<\/code>) und heredoc (<code>&lt;&lt;&lt;<\/code>) auf verschiedene Weise:<\/p>\n<ol>\n<li>Direktes Einbetten von Variablen &#8211; <code>\u201c$foo\u201d<\/code><\/li>\n<li>Mit geschweiften Klammern au\u00dferhalb der Variablen &#8211; <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Mit geschweiften Klammern nach dem Dollarzeichen &#8211; <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Variable Variablen &#8211; <code>\u201c${expr}\u201d<\/code> &#8211; entspricht der Verwendung von <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>Die ersten beiden M\u00f6glichkeiten haben ihre Vor- und Nachteile, w\u00e4hrend die beiden letzteren eine komplexe und widerspr\u00fcchliche Syntax haben. Mit PHP 8.2 werden die <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">letzten beiden M\u00f6glichkeiten der Stringeinbettung veraltet<\/a>.<\/p>\n<p>Du solltest in Zukunft keine Strings mehr auf diese Weise interpolieren:<\/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>Ab PHP 9.0 werden diese veralteten Methoden aktualisiert und f\u00fchren zu einem Ausnahmefehler.<\/p>\n<h3>Verwerfung der mbstring-Funktionen f\u00fcr Base64\/QPrint\/Uuencode\/HTML-Entities<\/h3>\n<p>Die mbstring-Funktionen (Multi-Byte-String) von PHP helfen uns bei der Arbeit mit Unicode, HTML-Entities und anderen alten Textkodierungen.<\/p>\n<p>Base64, Uuencode und QPrint sind jedoch keine Textkodierungen und sind trotzdem Teil dieser Funktionen &#8211; vor allem aus Legacy-Gr\u00fcnden. PHP enth\u00e4lt auch separate Implementierungen dieser Kodierungen.<\/p>\n<p>F\u00fcr HTML-Entities gibt es in PHP integrierte Funktionen &#8211; <code>htmlspecialchars()<\/code> und <code>htmlentities()<\/code> -, die besser mit ihnen umgehen k\u00f6nnen. Im Gegensatz zu mbstring wandeln diese Funktionen zum Beispiel auch <code>&lt;<\/code>. <code>&gt;<\/code>. und <code>&<\/code> in HTML-Entities um.<\/p>\n<p>Au\u00dferdem verbessert PHP seine eingebauten Funktionen st\u00e4ndig &#8211; <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">so wie PHP 8.1 mit den Funktionen zur HTML-Kodierung und -Dekodierung<\/a>.<\/p>\n<p>Aus diesem Grund wird in PHP 8.2 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">die Verwendung von mbstring f\u00fcr diese Kodierungen nicht mehr empfohlen<\/a> (Gro\u00df- und Kleinschreibung wird nicht beachtet):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (Alias von HTML-ENTITIES)<\/li>\n<li>Quoted-Printable<\/li>\n<li>qprint (alias von Quoted-Printable)<\/li>\n<\/ul>\n<p>Ab PHP 8.2 wird die Verwendung von mbstring zur Kodierung\/Dekodierung einer der oben genannten Kodierungen einen Verwerfungshinweis ausgeben. Mit PHP 9.0 wird die mbstring-Unterst\u00fctzung f\u00fcr diese Kodierungen komplett entfernt.<\/p>\n<h2>Andere kleinere \u00c4nderungen in PHP 8.2<\/h2>\n<p>Abschlie\u00dfend k\u00f6nnen wir die kleineren \u00c4nderungen in PHP 8.2 besprechen, einschlie\u00dflich der entfernten Features und Funktionalit\u00e4ten.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Unterst\u00fctzung f\u00fcr libmysql von mysqli entfernen<\/h3>\n<p>Zurzeit erlaubt PHP den Treibern <code>mysqli<\/code> und <code>PDO_mysql<\/code>, gegen die Bibliotheken <code>mysqlnd<\/code> und <code>libmysql<\/code> zu bauen. Der Standardtreiber, der seit PHP 5.4 empfohlen wird, ist jedoch <code>mysqlnd<\/code>.<\/p>\n<p>Diese beiden Treiber haben viele Vor- und Nachteile. Wenn du jedoch die Unterst\u00fctzung f\u00fcr einen der beiden Treiber entfernst &#8211; idealerweise <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\"> <code>libmysql<\/code>, da es nicht der Standardtreiber ist -, vereinfachst du den PHP-Code und die Unit-Tests.<\/a><\/p>\n<p>Um ein Argument daf\u00fcr zu finden, listet der RFC viele Vorteile von <code>mysqlnd<\/code> auf:<\/p>\n<ul>\n<li>Es ist mit PHP geb\u00fcndelt<\/li>\n<li>Es nutzt die PHP-Speicherverwaltung, um die Speichernutzung zu \u00fcberwachen und<br \/>\n<a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-leistung\/\">Performance zu verbessern<\/a><\/li>\n<li>Bietet Quality-of-Life-Funktionen (z. B. <code>get_result()<\/code>)<\/li>\n<li>Gibt numerische Werte mit PHP-eigenen Typen zur\u00fcck<\/li>\n<li>Die Funktionalit\u00e4t ist nicht von einer externen Bibliothek abh\u00e4ngig<\/li>\n<li>Optionale Plugin-Funktionalit\u00e4t<\/li>\n<li>Unterst\u00fctzt asynchrone Abfragen<\/li>\n<\/ul>\n<p>Der RFC listet auch einige Vorteile von <code>libmysql<\/code> auf, darunter:<\/p>\n<ul>\n<li>Auto-Reconnect ist m\u00f6glich (<code>mysqlnd<\/code> unterst\u00fctzt diese Funktion absichtlich nicht, da sie leicht ausgenutzt werden kann)<\/li>\n<li>LDAP- und SASL-Authentifizierungsmodi (<code>mysqlnd<\/code> <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">wird diese Funktion m\u00f6glicherweise<\/a> bald <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">hinzuf\u00fcgen<\/a> )<\/li>\n<\/ul>\n<p>Dar\u00fcber hinaus listet der RFC viele Nachteile von <code>libmysql<\/code> auf &#8211; Inkompatibilit\u00e4t mit dem PHP-Speichermodell, viele fehlgeschlagene Tests, Speicherlecks, unterschiedliche Funktionalit\u00e4ten zwischen den Versionen usw.<\/p>\n<p>Vor diesem Hintergrund wurde mit PHP 8.2 die Unterst\u00fctzung f\u00fcr die Erstellung von <code>mysqli<\/code> gegen <code>libmysql<\/code> entfernt.<\/p>\n<p>Wenn du eine Funktion hinzuf\u00fcgen m\u00f6chtest, die nur mit <code>libmysql<\/code> verf\u00fcgbar ist, musst du sie explizit als Feature Request zu<code> mysqlnd<\/code> hinzuf\u00fcgen. Au\u00dferdem kannst du keine automatische Verbindungswiederherstellung hinzuf\u00fcgen.<\/p>\n<h3>Lokal-unabh\u00e4ngige Fallkonvertierung<\/h3>\n<p>Vor <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8\/\">PHP 8.0<\/a> wurde das Gebietsschema von PHP von der Systemumgebung geerbt. Dies konnte jedoch in einigen F\u00e4llen zu Problemen f\u00fchren.<\/p>\n<p>Wenn du deine Sprache bei der Installation von Linux einstellst, wird die entsprechende Sprache der Benutzeroberfl\u00e4che f\u00fcr die <a href=\"https:\/\/kinsta.com\/de\/blog\/linux-befehle\/\">eingebauten Befehle<\/a> eingestellt. Allerdings \u00e4ndert sich dadurch auch unerwartet die Art und Weise, wie die String-Bearbeitung der C-Bibliothek funktioniert.<\/p>\n<p>Wenn du zum Beispiel bei der Installation von Linux die Sprache &#8222;T\u00fcrkisch&#8220; oder &#8222;Kasachisch&#8220; ausgew\u00e4hlt hast, wirst du feststellen, dass der Aufruf von <code>toupper('i')<\/code>, um das \u00c4quivalent in Gro\u00dfbuchstaben zu erhalten, das <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">gepunktete gro\u00dfe I<\/a> (U+0130, <code>\u0130<\/code>) ergibt.<\/p>\n<p>Mit PHP 8.0 wurde diese Anomalie beseitigt, indem das Standard-Locale auf &#8222;C&#8220; gesetzt wurde, es sei denn, der Benutzer \u00e4ndert es ausdr\u00fccklich \u00fcber <code>setlocale()<\/code>.<\/p>\n<p>PHP 8.2 geht sogar noch einen Schritt weiter, indem es <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">die Gro\u00df- und Kleinschreibung nicht mehr von der Locale ab\u00e4ngig macht<\/a>. Dieser RFC \u00e4ndert vor allem <code>strtolower()<\/code>, <code>strtoupper()<\/code> und verwandte Funktionen. Im RFC findest du eine Liste aller betroffenen Funktionen.<\/p>\n<p>Wenn du die lokalisierte Gro\u00df- und Kleinschreibung verwenden m\u00f6chtest, kannst du alternativ <code>mb_strtolower()<\/code> verwenden.<\/p>\n<h3>Verbesserung der Random Extension<\/h3>\n<p>PHP plant, <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">seine Zufallsfunktionalit\u00e4t zu \u00fcberarbeiten<\/a>.<\/p>\n<p>Zurzeit basiert die PHP-Zufallsfunktion stark auf dem <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">Mersenne Twister-Status<\/a>. Dieser Zustand wird jedoch implizit im globalen Bereich von PHP gespeichert &#8211; es gibt keine M\u00f6glichkeit f\u00fcr den Benutzer, darauf zuzugreifen. Das Hinzuf\u00fcgen von Zufallsfunktionen zwischen der ersten Seeding-Phase und der beabsichtigten Verwendung w\u00fcrde den Code kaputt machen.<\/p>\n<p>Die Pflege eines solchen Codes kann sogar noch komplizierter sein, wenn dein Code externe Pakete verwendet.<\/p>\n<p>Die aktuelle Zufallsfunktion von PHP kann also keine konsistenten Zufallswerte erzeugen. Sie versagt sogar bei empirischen statistischen Tests einheitlicher Zufallszahlengeneratoren, wie <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">Crush und BigCrush von TestU01<\/a>. Die 32-Bit-Beschr\u00e4nkung von Mersenne Twister verschlimmert das Problem noch weiter.<\/p>\n<p>Daher ist es nicht empfehlenswert, die in PHP eingebauten Funktionen &#8211; <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> &#8211; zu verwenden, wenn du kryptografisch sichere Zufallszahlen ben\u00f6tigst. In solchen F\u00e4llen musst du eine neue Funktion mit <code>random_int()<\/code> oder \u00e4hnlichen Funktionen implementieren.<\/p>\n<p>Nachdem die Abstimmung begonnen hatte, wurden jedoch <a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">mehrere Probleme mit diesem RFC<\/a> aufgeworfen. Dieser R\u00fcckschlag zwang das PHP-Team dazu, alle Probleme in einem separaten RFC festzuhalten und f\u00fcr jedes Problem eine Abstimmungsoption zu erstellen. Erst wenn ein Konsens erreicht ist, wird \u00fcber das weitere Vorgehen entschieden.<\/p>\n<h2>Zus\u00e4tzliche RFCs in PHP 8.2<\/h2>\n<p>PHP 8.2 enth\u00e4lt auch viele neue Funktionen und kleinere \u00c4nderungen. Wir erw\u00e4hnen sie im Folgenden mit Links zu weiteren Ressourcen:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Neue Funktion <code>curl_upkeep<\/code>:<\/a> PHP 8.2 f\u00fcgt diese neue Funktion zu seiner Curl-Erweiterung hinzu. Sie ruft die Funktion <code>curl_easy_upkeep()<\/code> in libcurl auf, der zugrunde liegenden C-Bibliothek, die die PHP-Curl-Erweiterung nutzt.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Neue Funktion <code>ini_parse_quantity<\/code>:<\/a> PHP INI-Direktiven akzeptieren Datengr\u00f6\u00dfen mit einem Multiplikator-Suffix. Du kannst zum Beispiel 25 Megabyte als <code>25M<\/code> oder 42 Gigabyte als <code>42G<\/code> schreiben. Diese Suffixe sind in PHP-INI-Dateien \u00fcblich, aber in anderen Dateien eher un\u00fcblich. Diese neue Funktion parst die <a href=\"https:\/\/kinsta.com\/de\/blog\/maximale-upload-groesse-dateien-wordpress\/#create-or-modify-the-phpini-file\">PHP INI-Werte<\/a> und gibt ihre Datengr\u00f6\u00dfe in Bytes zur\u00fcck.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Neue Funktion <code>memory_reset_peak_usage<\/code>:<\/a> Diese Funktion setzt die von der Funktion <code>memory_get_peak_usage<\/code> zur\u00fcckgegebene maximale Speichernutzung zur\u00fcck. Das kann praktisch sein, wenn du dieselbe Aktion mehrmals ausf\u00fchrst und den maximalen Speicherverbrauch jedes Durchlaufs aufzeichnen m\u00f6chtest.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">Unterst\u00fctzung f\u00fcr den Modifikator no-capture (<code>\/n<\/code>) in <code>preg_*<\/code> Funktionen<\/a>: In Regex kennzeichnen die Metazeichen <code>()<\/code> eine Fanggruppe. Das bedeutet, dass alle \u00dcbereinstimmungen mit dem Ausdruck innerhalb der Klammer zur\u00fcckgegeben werden. PHP 8.2 f\u00fcgt einen No-Capture-Modifikator (<code>\/n<\/code>) hinzu, um dieses Verhalten zu unterbinden.<\/li>\n<li>Die<a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\"> <code>iterator_*()<\/code> <\/a> Familie muss alle Iterablen akzeptieren: Bisher akzeptiert die <code>iterator_*()<\/code> Familie von PHP nur <code>\\Traversables<\/code> (d.h. es sind keine einfachen Arrays erlaubt). Das ist eine unn\u00f6tige Einschr\u00e4nkung, die mit diesem RFC behoben wird.<\/li>\n<\/ol>\n<h2>Zusammenfassung<\/h2>\n<p>PHP 8.2 baut auf den massiven Verbesserungen in PHP 8.0 und PHP 8.1 auf, was keine leichte Aufgabe ist. Die spannendsten Funktionen von PHP 8.2 sind unserer Meinung nach die neuen eigenst\u00e4ndigen Typen, die schreibgesch\u00fctzten Eigenschaften und die zahlreichen Leistungsverbesserungen.<\/p>\n<p>Wir k\u00f6nnen es kaum erwarten, <a href=\"https:\/\/kinsta.com\/de\/blog\/php-benchmarks\/\">PHP<\/a> 8.2 mit verschiedenen <a href=\"https:\/\/kinsta.com\/de\/blog\/php-frameworks\/\">PHP-Frameworks<\/a> und <a href=\"https:\/\/kinsta.com\/de\/wordpress-marktanteil\/\">CMS<\/a> zu vergleichen.<\/p>\n<p>Setze ein Lesezeichen f\u00fcr diesen Blog-Beitrag, damit du in Zukunft darauf zur\u00fcckgreifen kannst.<\/p>\n<p><em>Welche Funktionen von PHP 8.2 sind deine Favoriten? Welche Fehler sind dir am wenigsten wichtig? Bitte teile deine Meinung mit unserer Community in den Kommentaren!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.2 baut auf der erneuerten Basis von PHP 8.0 und PHP 8.1 auf. Jetzt, wo PHP 8.2 ver\u00f6ffentlicht wurde, wollen wir uns die Neuerungen in &#8230;<\/p>\n","protected":false},"author":117,"featured_media":53215,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[971],"class_list":["post-53214","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-php-updates"],"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>Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen<\/title>\n<meta name=\"description\" content=\"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.\" \/>\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\/de\/blog\/php-8-2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr\" \/>\n<meta property=\"og:description\" content=\"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-11T12:22:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-27T10:42:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/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. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Was ist neu in PHP 8.2 &#8211; Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr\",\"datePublished\":\"2022-08-11T12:22:54+00:00\",\"dateModified\":\"2023-07-27T10:42:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\"},\"wordCount\":3397,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\",\"name\":\"Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png\",\"datePublished\":\"2022-08-11T12:22:54+00:00\",\"dateModified\":\"2023-07-27T10:42:43+00:00\",\"description\":\"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP-Updates\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/php-updates\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Was ist neu in PHP 8.2 &#8211; Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen","description":"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.","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\/de\/blog\/php-8-2\/","og_locale":"de_DE","og_type":"article","og_title":"Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr","og_description":"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.","og_url":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2022-08-11T12:22:54+00:00","article_modified_time":"2023-07-27T10:42:43+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Salman Ravoof","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Was ist neu in PHP 8.2 &#8211; Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr","datePublished":"2022-08-11T12:22:54+00:00","dateModified":"2023-07-27T10:42:43+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/"},"wordCount":3397,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/","name":"Was ist neu in PHP 8.2 - Neue Funktionen, Verwerfungen, \u00c4nderungen","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","datePublished":"2022-08-11T12:22:54+00:00","dateModified":"2023-07-27T10:42:43+00:00","description":"PHP 8.2. ist ver\u00f6ffentlicht worden. Entdecke alle neuen Funktionen, Verbesserungen, Verwerfungen und kleineren \u00c4nderungen, die mit dem Release einhergehen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/08\/whats-new-in-php-82.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/php-8-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"PHP-Updates","item":"https:\/\/kinsta.com\/de\/thema\/php-updates\/"},{"@type":"ListItem","position":3,"name":"Was ist neu in PHP 8.2 &#8211; Neue Funktionen, Verwerfungen, \u00c4nderungen und mehr"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/53214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=53214"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/53214\/revisions"}],"predecessor-version":[{"id":57454,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/53214\/revisions\/57454"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/translations\/se"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/53214\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/53215"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=53214"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=53214"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=53214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}