{"id":35005,"date":"2020-05-27T03:28:55","date_gmt":"2020-05-27T10:28:55","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-08-21T09:17:57","modified_gmt":"2023-08-21T08:17:57","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/php-8\/","title":{"rendered":"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)"},"content":{"rendered":"<p>PHP 8 wurde am 26. November 2020 offiziell f\u00fcr die allgemeine Verf\u00fcgbarkeit freigegeben!<\/p>\n<p>Dieses neue gr\u00f6\u00dfere Update bringt eine ganze Reihe von Optimierungen und leistungsstarken Funktionen in die Sprache, und wir freuen uns darauf, dir die interessantesten \u00c4nderungen vorzustellen, die es uns erm\u00f6glichen, besseren Code zu schreiben und leistungsf\u00e4higere Anwendungen zu erstellen.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-84636 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8.0 Ank\u00fcndigungs-Addendum\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Ank\u00fcndigungs-Addendum<\/a><\/figcaption><\/figure>\n<p>Bist du bereit? Lasst uns eintauchen!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (Just in Time Compiler)<\/h2>\n<p>Das am meisten gelobte Feature, das mit PHP 8 kommt, ist der <strong>Just-in-time (JIT) Compiler<\/strong>. Was hat es mit JIT auf sich?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">Der RFC-Vorschlag beschreibt<\/a> JIT wie folgt:<\/p>\n<blockquote><p>&#8222;PHP JIT ist als ein fast unabh\u00e4ngiger Teil von OPcache implementiert. Es kann zur PHP-Kompilierzeit und zur Laufzeit aktiviert\/deaktiviert werden. Wenn es aktiviert ist, wird der native Code der PHP-Dateien in einer zus\u00e4tzlichen Region des OPcache-Shared Memory gespeichert und op_array\u2192opcodes[].handler(s) behalten Zeiger auf die Einstiegspunkte des JIT-ed-Codes.&#8220;<\/p><\/blockquote>\n<p>Also, wie sind wir zu JIT gekommen und was ist der Unterschied zwischen JIT vs. OPcache?<\/p>\n<p>Um besser zu verstehen, was JIT f\u00fcr PHP ist, wollen wir einen kurzen Blick darauf werfen, wie <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-php\/\">PHP<\/a> vom Quellcode bis zum Endergebnis ausgef\u00fchrt wird.<\/p>\n<p>Die PHP-Ausf\u00fchrung ist ein 4-stufiger Prozess:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenisierung<\/strong>: Zuerst liest der Interpreter den PHP-Code und baut einen Satz von Token.<\/li>\n<li><strong>Parsen<\/strong>: Der Interpreter pr\u00fcft, ob das Skript den Syntaxregeln entspricht und benutzt Token, um einen <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">Abstract Syntax Tree<\/a> (AST) zu erstellen, der <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">eine hierarchische Darstellung der Struktur des Quellcodes darstellt<\/a>.<\/li>\n<li><strong>Kompilierung<\/strong>: Der Interpreter durchquert den Baum und \u00fcbersetzt die AST-Knoten in low-level Zend Opcodes, die numerische Identifikatoren sind, die die Art der von der <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">Zend VM ausgef\u00fchrten Instruktionen bestimmen<\/a>.<\/li>\n<li><strong>Interpretation<\/strong>: Opcodes werden interpretiert und auf der Zend VM ausgef\u00fchrt.<\/li>\n<\/ul>\n<p>Das folgende Bild zeigt eine visuelle Darstellung des grundlegenden PHP-Ausf\u00fchrungsprozesses.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-execution-1.png\" alt=\"Grundlegender PHP-Ausf\u00fchrungsprozess\" width=\"1100\" height=\"1460\"><figcaption class=\"wp-caption-text\">Grundlegender PHP-Ausf\u00fchrungsprozess<\/figcaption><\/figure>\n<p>Also, wie macht OPcache PHP schneller? Und was \u00e4ndert sich im Ausf\u00fchrungsprozess mit JIT?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Die OPcache-Erweiterung<\/h3>\n<p>PHP ist eine interpretierte Sprache. Das bedeutet, wenn ein PHP-Skript l\u00e4uft, parst, kompiliert und f\u00fchrt der Interpreter den Code bei jeder Anfrage wieder und wieder aus. Dies kann zu einer <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">Verschwendung von CPU-Ressourcen<\/a> und zus\u00e4tzlicher Zeit f\u00fchren.<\/p>\n<p>Hier kommt die <a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">OPcache-Erweiterung<\/a> ins Spiel:<\/p>\n<blockquote><p>&#8222;OPcache verbessert die PHP-Leistung, indem vorkompilierter Skript-Bytecode im Shared Memory gespeichert wird, wodurch PHP nicht mehr bei jeder Anfrage Skripte laden und parsen muss.&#8220;<\/p><\/blockquote>\n<p>Wenn OPcache aktiviert ist, durchl\u00e4uft der PHP-Interpreter den oben erw\u00e4hnten 4-Stufen-Prozess nur beim ersten Ausf\u00fchren des Skripts. Da PHP-Bytekodes im Shared Memory gespeichert werden, sind sie sofort als low-level Zwischendarstellung verf\u00fcgbar und k\u00f6nnen sofort auf der Zend VM ausgef\u00fchrt werden.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-execution-2.png\" alt=\"PHP-Ausf\u00fchrungsprozess mit aktiviertem OPcache\" width=\"1100\" height=\"1560\"><figcaption class=\"wp-caption-text\">PHP-Ausf\u00fchrungsprozess mit aktiviertem OPcache<\/figcaption><\/figure>\n<p>Ab PHP 5.5 ist die Zend OPcache-Erweiterung standardm\u00e4\u00dfig verf\u00fcgbar und du kannst \u00fcberpr\u00fcfen, ob du sie korrekt konfiguriert hast, indem du einfach <a href=\"https:\/\/kinsta.com\/de\/blog\/phpinfo\/\"><code>phpinfo()<\/code> von einem Skript auf deinem Server aufrufst<\/a> oder deine php.ini-Datei auscheckst (siehe <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">OPcache-Konfigurationseinstellungen<\/a>).<\/p>\n<p>Vorgeschlagene Lekt\u00fcre: <a href=\"https:\/\/kinsta.com\/de\/blog\/php-memorylimit\/\">Wie man die PHP-Speicherbegrenzung in WordPress verbessern kann.<\/a><\/p>\n<figure style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/zend-opcache.jpg\" alt=\"Zend OPcache Sektion in einer phpinfo Seite\" width=\"1926\" height=\"992\"><figcaption class=\"wp-caption-text\">Zend OPcache Sektion in einer phpinfo Seite<\/figcaption><\/figure>\n<h3>Vorladen<\/h3>\n<p>OPcache wurde k\u00fcrzlich mit der Implementierung des <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">Vorladens<\/a> verbessert, einer neuen OPcache-Funktion, die mit <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-4\/\">PHP 7.4<\/a> hinzugef\u00fcgt wurde. Das Vorladen bietet dir eine M\u00f6glichkeit, einen bestimmten Satz von Skripten im OPcache-Speicher zu speichern, &#8222;bevor irgendein Anwendungscode ausgef\u00fchrt wird&#8220;, aber es bringt keine greifbare Leistungsverbesserung f\u00fcr typische webbasierte Anwendungen.<\/p>\n<p>Du kannst mehr \u00fcber das Vorladen in unserer <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-4\/#preloading\">Einf\u00fchrung zu PHP 7.4 lesen<\/a>.<\/p>\n<p>Mit JIT geht PHP einen Schritt vorw\u00e4rts.<\/p>\n<h3>JIT \u2014 The Just in Time Compiler<\/h3>\n<p>Auch wenn die Opcodes in Form von niedrigstufigen Zwischendarstellungen vorliegen, m\u00fcssen sie dennoch in Maschinencode \u00fcbersetzt werden. JIT &#8222;f\u00fchrt keine zus\u00e4tzliche IR (Intermediate Representation)-Form ein&#8220;, sondern verwendet <a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Dynamic Assembler f\u00fcr Codegenerierungs-Engines), um nativen Code direkt aus dem PHP-Bytecode zu generieren.<\/p>\n<p>Kurz gesagt, <strong>JIT \u00fcbersetzt die hei\u00dfen Teile des Zwischencodes in Maschinencode<\/strong>. Da es die Kompilierung umgeht, kann es erhebliche Verbesserungen der Leistung und des Speicherverbrauchs bringen.<\/p>\n<p>Zeev Surasky, Co-Autor des PHP-JIT-Vorschlags, zeigt, um wie viel schneller Berechnungen mit JIT w\u00e4ren:<\/p>\n<p>\u00a0<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Aber, w\u00fcrde JIT die <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-performance\/\">Leistung von WordPress<\/a> effektiv verbessern?<\/p>\n<h3>JIT f\u00fcr Live Web Apps<\/h3>\n<p>Laut dem JIT RFC sollte die just in time Compiler Implementierung die PHP Performance verbessern. Aber w\u00fcrden wir solche Verbesserungen wirklich in echten Anwendungen wie WordPress erleben?<\/p>\n<p>Die fr\u00fchen Tests zeigen, dass JIT CPU-intensive Arbeitslasten deutlich schneller laufen lassen w\u00fcrde, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">warnt der RFC jedoch<\/a>:<\/p>\n<blockquote><p>&#8222;&#8230; wie bei den vorherigen Versuchen &#8211; es scheint derzeit keine signifikante Verbesserung von Real-Life-Anwendungen wie WordPress zu bringen (mit opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Es ist geplant, dir zus\u00e4tzlichen Aufwand zu bieten, indem JIT f\u00fcr real-life Apps verbessert wird, mit Hilfe von Profiling und spekulativen Optimierungen&#8220;.<\/p><\/blockquote>\n<p>Mit aktiviertem JIT w\u00fcrde der Code nicht von der Zend VM, sondern von der CPU selbst ausgef\u00fchrt werden, und das w\u00fcrde die Geschwindigkeit bei der Berechnung verbessern. Webanwendungen wie <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-wordpress\/\">WordPress<\/a> h\u00e4ngen auch von anderen Faktoren wie <a href=\"https:\/\/kinsta.com\/de\/blog\/ttfb\/\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-datenbankproblemen-repariert\/\">Datenbankoptimierung<\/a>, <a href=\"https:\/\/kinsta.com\/de\/lernen\/http2\/\">HTTP-Anfragen<\/a>, etc. ab.<\/p>\n<figure id=\"attachment_84635\" aria-describedby=\"caption-attachment-84635\" style=\"width: 1884px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-84635 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-performance-diagram.png\" alt=\"Relativer JIT-Beitrag zur Leistung von PHP 8 \" width=\"1884\" height=\"1206\"><figcaption id=\"caption-attachment-84635\" class=\"wp-caption-text\">Relativer JIT-Beitrag zur Leistung von PHP 8 (Bildquelle: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Ank\u00fcndigungs-Addendum<\/a>)<\/figcaption><\/figure>\n<p>Also, wenn es um WordPress und \u00e4hnliche Anwendungen geht, sollten wir keine gro\u00dfe Steigerung der PHP-Ausf\u00fchrungsgeschwindigkeit erwarten. Nichtsdestotrotz k\u00f6nnte JIT den <a href=\"https:\/\/kinsta.com\/de\/blog\/gehalt-webentwickler\/\">Entwicklern<\/a> einige Vorteile bringen.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">Laut Nikita Popov:<\/a><\/p>\n<blockquote><p>&#8222;Die Vorteile des JIT-Compilers sind ungef\u00e4hr (und wie bereits im RFC beschrieben):<\/p>\n<ul>\n<li>Deutlich bessere Leistung f\u00fcr numerischen Code.<\/li>\n<li>Etwas bessere Leistung f\u00fcr &#8222;typischen&#8220; PHP-Webanwendungscode.<\/li>\n<li>Das Potential, mehr Code von C nach PHP zu verschieben, da PHP nun ausreichend schnell sein wird.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Also, w\u00e4hrend JIT kaum riesige Verbesserungen der WordPress-Performance bringen wird, wird es PHP auf die n\u00e4chste Stufe heben und es zu einer Sprache machen, in der viele Funktionen nun direkt geschrieben werden k\u00f6nnten.<\/p>\n<p>Der Nachteil w\u00e4re allerdings die gr\u00f6\u00dfere Komplexit\u00e4t, die zu steigenden Kosten f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-wartung\/\">Wartung<\/a>, Stabilit\u00e4t und <a href=\"https:\/\/kinsta.com\/de\/blog\/debugging-wordpress\/\">Debugging<\/a> f\u00fchren kann. Laut Dmitry Stogov:<\/p>\n<blockquote><p>&#8222;JIT ist extrem einfach, aber trotzdem erh\u00f6ht es den Grad der gesamten PHP-Komplexit\u00e4t, das Risiko neuartiger Bugs und die Kosten f\u00fcr Entwicklung und Wartung.<\/p><\/blockquote>\n<p>Der Vorschlag, JIT in PHP 8 aufzunehmen, wurde mit 50 zu 2 Stimmen angenommen.<\/p>\n\n<h2>PHP 8 Verbesserungen und neue Funktionen.<\/h2>\n<p>Abgesehen von JIT, k\u00f6nnen wir viele Funktionen und Verbesserungen mit PHP 8 erwarten. Die folgende Liste ist unsere handverlesene Auswahl der kommenden Erg\u00e4nzungen und \u00c4nderungen, die PHP zuverl\u00e4ssiger und effizienter machen sollen.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"17\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Constructor Property Promotion<\/h3>\n<p>Als Ergebnis einer andauernden Diskussion dar\u00fcber, wie man die <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">Objekt-Ergonomie in PHP<\/a> verbessern kann, schl\u00e4gt <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">der Constructor Property Promotion RFC<\/a> eine neue und pr\u00e4gnantere Syntax vor, die die Property-Deklaration vereinfacht und sie k\u00fcrzer und weniger \u00fcberfl\u00fcssig macht.<\/p>\n<p>Dieser Vorschlag bezieht sich nur auf <strong>Promoted-Parameter<\/strong>, d.h. jene Methodenparameter, denen <strong>\u00f6ffentliche<\/strong>, <strong>gesch\u00fctzte<\/strong> und <strong>private<\/strong> Sichtbarkeits-Keywords vorangestellt werden.<\/p>\n<p>Derzeit m\u00fcssen alle Eigenschaften mehrmals (mindestens viermal) wiederholt werden, bevor wir sie mit Objekten verwenden k\u00f6nnen. Betrachte das folgende Beispiel aus dem RFC:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/pre>\n<p>Laut Nikita Popov, dem Autor des RFC, m\u00fcssen wir den Property-Namen mindestens viermal an drei verschiedenen Stellen schreiben: die Property-Deklaration, die Constructor-Parameter und die Property-Zuweisung. Diese Syntax ist nicht besonders brauchbar, vor allem in Klassen mit einer guten Anzahl von Eigenschaften und aussagekr\u00e4ftigeren Namen.<\/p>\n<p>Dieser RFC schl\u00e4gt vor, den Konstruktor und die Parameterdefinition zusammenzuf\u00fchren. Ab PHP 8 haben wir also eine brauchbarere Art und Weise, Parameter zu deklarieren, und der oben programmierte Code kann sich wie unten gezeigt \u00e4ndern:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/pre>\n<p>Und das war&#8217;s. Wir haben also einen neuen Weg, um Eigenschaften zu bewerben, der k\u00fcrzer, lesbarer und weniger fehleranf\u00e4llig ist. <a href=\"https:\/\/phpinternals.news\/53\">Laut Nikita<\/a>:<\/p>\n<blockquote><p>Es ist eine einfache syntaktische Umwandlung, die wir machen. Aber das reduziert die Menge an Boilerplate Code, den man vor allem f\u00fcr Wertobjekte schreiben muss.<\/p><\/blockquote>\n<p>Die Eigenschaftsdeklaration wird transformiert, da wir diese Eigenschaften explizit deklariert haben, und wir k\u00f6nnen die <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">Reflection-API<\/a> benutzen, um Eigenschaftsdefinitionen vor der Ausf\u00fchrung zu introspektieren (siehe <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>Reflection (und andere Introspektionsmechanismen) werden den Zustand nach dem Desugaring beobachten. Das bedeutet, dass bef\u00f6rderte Eigenschaften genauso wie explizit deklarierte Eigenschaften erscheinen werden, und bef\u00f6rderte Konstruktor-Argumente werden wie gew\u00f6hnliche Konstruktor-Argumente erscheinen.<\/p><\/blockquote>\n<pre><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/pre>\n<h4>Inheritance<\/h4>\n<p>Wir haben keine Einschr\u00e4nkungen bei der Verwendung von Vererbung in Verbindung mit Promotions-Parametern. Wie auch immer, es gibt keine besondere Beziehung zwischen Parent- und Child-Klassenkonstruktoren. <a href=\"https:\/\/phpinternals.news\/53\">Laut Nikita<\/a>:<\/p>\n<blockquote><p>Normalerweise sagen wir, dass Methoden immer mit der Parentmethode kompatibel sein m\u00fcssen. [&#8230;] aber diese Regel gilt nicht f\u00fcr den Konstruktor. Der Konstruktor geh\u00f6rt also wirklich zu einer einzigen Klasse, und Konstruktoren zwischen Parent- und Child-Klasse m\u00fcssen in keiner Weise kompatibel sein.<\/p><\/blockquote>\n<p>Hier ist ein Beispiel:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/pre>\n<h4>What&#8217;s Not Allowed With Promoted Properties<\/h4>\n<p>Promoted Eigenschaften sind in nicht-abstrakten Konstrukteuren und Eigenschaften erlaubt, aber es gibt einige Einschr\u00e4nkungen, die hier erw\u00e4hnt werden sollten.<\/p>\n<h5>Abstract Constructors<\/h5>\n<p>Promoted Eigenschaften sind in abstrakten Klassen und Interfaces nicht erlaubt:<\/p>\n<pre><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/pre>\n<h5>Nullability<\/h5>\n<p>Eine der bemerkenswertesten Einschr\u00e4nkungen bezieht sich auf die Annullierbarkeit. Fr\u00fcher, wenn wir einen Typ benutzten, der nicht explizit l\u00f6schbar war, aber mit einem Standardwert von null, war der Typ implizit l\u00f6schbar. Aber bei Property-Typen haben wir dieses implizite Verhalten nicht, weil die Promoted-Parameter eine Property-Deklaration erfordern und der nullbare Typ explizit deklariert werden muss. Siehe das folgende Beispiel aus dem RFC:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/pre>\n<h5>Callable Type<\/h5>\n<p>Da Callable kein <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-4\/#typed-properties\">unterst\u00fctzter Typ f\u00fcr Eigenschaften ist<\/a>, ist es uns nicht erlaubt, den Callable-Typ in beworbenen Eigenschaften zu verwenden:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>The var Keyword Is Not Allowed<\/h5>\n<p>Nur ein visibility-Schl\u00fcsselwort kann mit promoted-Parametern verwendet werden, daher ist es nicht erlaubt, Konstruktoreigenschaften mit dem <code>var<\/code>-Schl\u00fcsselwort zu deklarieren (siehe das folgende Beispiel aus dem RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>No Duplications Allowed<\/h5>\n<p>Wir k\u00f6nnen promoted Eigenschaften und explizite Eigenschaften in der gleichen Klasse kombinieren, aber Eigenschaften k\u00f6nnen nicht zweimal deklariert werden:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/pre>\n<h5>Variadic Parameters Are Not Allowed<\/h5>\n<p>Der Grund daf\u00fcr ist, dass sich der deklarierte Typ von dem variadischen Parameter unterscheidet, der eigentlich ein Array ist:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Further Readings<\/h4>\n<p>Um einen genaueren Blick auf Costructor Property Promotion zu werfen, h\u00f6rt euch dieses <a href=\"https:\/\/phpinternals.news\/53\">Interview mit Nikita Popov an<\/a>. F\u00fcr einen tieferen Einblick in die Objekt-Ergonomie in PHP, schau dir <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">diesen Beitrag<\/a> und das folgende <a href=\"https:\/\/phpinternals.news\/51\">Interview mit Larry Garfield<\/a> an.<strong>\u00a0<\/strong><\/p>\n<h3 id=\"abstract-trait-methods\">Validierung f\u00fcr abstrakte Eigenschaftsmethoden<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">Eigenschaften<\/a> werden definiert als &#8222;ein Mechanismus zur Wiederverwendung von Code in Sprachen mit einer einzigen Vererbung wie PHP&#8220;. Typischerweise werden sie verwendet, um Methoden zu deklarieren, die in mehreren Klassen verwendet werden k\u00f6nnen.<\/p>\n<p>Eine Eigenschaft kann auch abstrakte Methoden enthalten. Diese Methoden deklarieren einfach die Signatur der Methode, aber die Implementierung der Methode muss innerhalb der Klasse unter Verwendung der Eigenschaft erfolgen.<\/p>\n<p>Gem\u00e4\u00df dem <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">PHP-Handbuch<\/a>,<\/p>\n<blockquote><p>&#8222;Eigenschaften unterst\u00fctzen die Verwendung abstrakter Methoden, um Anforderungen an die ausstellende Klasse zu stellen.\u201d<\/p><\/blockquote>\n<p>Das bedeutet auch, dass die Signaturen der Methoden \u00fcbereinstimmen m\u00fcssen. Mit anderen Worten, die Art und die Anzahl der ben\u00f6tigten Argumente<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\"> m\u00fcssen gleich sein<\/a>.<\/p>\n<p>Wie auch immer, <a href=\"https:\/\/externals.io\/message\/108065#108164\">laut Nikita Popov<\/a>, Autor des RFC, wird die Signaturvalidierung derzeit nur punktuell durchgesetzt:<\/p>\n<ul>\n<li>In den meisten F\u00e4llen wird sie nicht erzwungen, da die Methodenimplementierung von der verwendenden Klasse angeboten wird: <a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Es wird durchgesetzt, wenn die Implementierung von einer Parent-Klasse kommt: <a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Es wird durchgesetzt, wenn die Implementierung von einer Child-Klasse kommt: <a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<p>Das folgende Beispiel von Nikita bezieht sich auf den ersten Fall (nicht erzwungene Unterschrift):<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Davon abgesehen schl\u00e4gt <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">dieser RFC<\/a> vor, immer einen fatalen Fehler zu werfen, wenn die Implementierungsmethode nicht mit der abstrakten Eigenschaftsmethode kompatibel ist, unabh\u00e4ngig von ihrem Ursprung:<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Dieser RFC wurde einstimmig angenommen.<\/p>\n<h3 id=\"incompatible-method-signatures\">Inkompatible Methodensignaturen<\/h3>\n<p>In PHP werfen Vererbungsfehler aufgrund inkompatibler Methodensignaturen entweder einen fatalen Fehler oder eine Warnung aus, je nachdem, was die Ursache des Fehlers ist.<\/p>\n<p>Wenn eine Klasse ein Interface implementiert, f\u00fchren inkompatible Methodensignaturen zu einem fatalen Fehler. Laut der <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">Dokumentation zu Objekt Interfaces<\/a>:<\/p>\n<blockquote><p>&#8222;Die Klasse, die das Interface implementiert, muss eine Methodensignatur verwenden, die mit dem LSP (Liskov Substitutionsprinzip) kompatibel ist. Wenn sie dies nicht tut, f\u00fchrt dies zu einem fatalen Fehler.&#8220;<\/p><\/blockquote>\n<p>Hier ist ein Beispiel f\u00fcr einen Vererbungsfehler mit einem Interface:<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4 w\u00fcrde der obige Code den folgenden Fehler ausl\u00f6sen:<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Eine Funktion in einer Child-Klasse mit einer inkompatiblen Signatur w\u00fcrde eine Warnung ausl\u00f6sen. Siehe den folgenden Code aus dem RFC:<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4 w\u00fcrde der obige Code einfach eine Warnung ausgeben:<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Nun schl\u00e4gt <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">dieser RFC<\/a> vor, bei inkompatiblen Methodensignaturen immer einen fatalen Fehler zu werfen. Mit PHP 8 w\u00fcrde der Code, den wir weiter oben gesehen haben, folgendes ausl\u00f6sen:<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Arrays, die mit einem negativen Index beginnen<\/h3>\n<p>In PHP, wenn ein Array mit einem negativen Index (<code>start_index &lt; 0<\/code>) beginnt, beginnen die folgenden Indizes bei 0 (mehr dazu in der <a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\"><code>array_fill<\/code> Dokumentation<\/a>). Schau dir das folgende Beispiel an:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>In PHP 7.4 w\u00fcrde das Ergebnis wie folgt aussehen:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Nun, <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">dieser RFC<\/a> schl\u00e4gt vor, die Dinge so zu \u00e4ndern, dass der zweite Index <code>start_index + 1<\/code> w\u00e4re, was auch immer der Wert von <code>start_index<\/code> ist.<\/p>\n<p>In PHP 8 w\u00fcrde der obige Code zu folgendem Array f\u00fchren:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Mit PHP 8 \u00e4ndern Arrays, die mit einem negativen Index beginnen, ihr Verhalten. Lies mehr \u00fcber R\u00fcckw\u00e4rtsinkompatibilit\u00e4ten im <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\">Union Types 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Union types<\/a> akzeptieren Werte, die von unterschiedlicher Art sein k\u00f6nnen. Derzeit bietet PHP keine Unterst\u00fctzung f\u00fcr Union types, mit Ausnahme der <code>?Type<\/code> syntax und dem special <code>iterable<\/code> type.<\/p>\n<p>Vor PHP 8 konnten Union types nur in phpdoc-Annotationen angegeben werden, wie das folgende Beispiel aus dem RFC zeigt:<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Nun schl\u00e4gt der <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">RFC f\u00fcr Union types 2.0<\/a> vor, Unterst\u00fctzung f\u00fcr Union types in Funktionssignaturen hinzuzuf\u00fcgen, so dass wir uns nicht mehr auf die Inline-Dokumentation verlassen, sondern stattdessen Union types mit einer <code>T1|T2|...<\/code> Syntax definieren w\u00fcrden:<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Wie von Nikita Popov im RFC erkl\u00e4rt,<\/p>\n<blockquote><p>&#8222;Die Unterst\u00fctzung von Union-Types in der Sprache erlaubt es uns, mehr Typinformationen aus phpdoc in Funktionssignaturen zu verschieben, mit den \u00fcblichen Vorteilen, die das mit sich bringt:<\/p><\/blockquote>\n<ul>\n<li>Typen werden tats\u00e4chlich durchgesetzt, so dass Fehler fr\u00fchzeitig erkannt werden k\u00f6nnen.<\/li>\n<li>Weil sie erzwungen werden, ist die Wahrscheinlichkeit geringer, dass Typinformationen veraltet sind oder Randfehler \u00fcbersehen werden.<\/li>\n<li>Die Typen werden w\u00e4hrend der Vererbung \u00fcberpr\u00fcft, wodurch das Liskov-Substitutionsprinzip durchgesetzt wird.<\/li>\n<li>Die Typen sind \u00fcber Reflection verf\u00fcgbar.<\/li>\n<li>Die Syntax ist viel weniger Boilerplate-y als phpdoc&#8220;.<\/li>\n<\/ul>\n<p>Union types unterst\u00fctzen alle verf\u00fcgbaren Typen, mit einigen Einschr\u00e4nkungen:<\/p>\n<ul>\n<li>Der Typ <code>void<\/code> kann nicht Teil einer Union sein, da <code>void<\/code> bedeutet, dass eine Funktion <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">keinen Wert zur\u00fcckgibt<\/a>.<\/li>\n<li>Der <code>null<\/code>-Typ wird nur in Union types unterst\u00fctzt, aber seine Verwendung als eigenst\u00e4ndiger Typ ist nicht erlaubt.<\/li>\n<li>Die nullbare Typ-Notation (<code>?T<\/code>) ist auch erlaubt, was <code>T|null<\/code> bedeutet, aber wir d\u00fcrfen die <code>?T<\/code>-Notation nicht in Union types verwenden (<code>?T1|T2<\/code> ist nicht erlaubt und wir sollten stattdessen <code>T1|T2|null<\/code> verwenden).<\/li>\n<li>Da viele Funktionen (z.B. <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, etc.) <code>false<\/code> unter den m\u00f6glichen R\u00fcckgabetypen einschlie\u00dfen, wird auch der <code>false<\/code> Pseudo-Typ unterst\u00fctzt.<\/li>\n<\/ul>\n<p>Mehr \u00fcber <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">Union Types V2<\/a> k\u00f6nnt ihr im RFC nachlesen.<\/p>\n<h3 id=\"type-errors-internal-functions\">Konsistente Typ-Fehler f\u00fcr interne Funktionen<\/h3>\n<p>Wenn ein Parameter vom illegalen Typ \u00fcbergeben wird, verhalten sich <a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\">interne<\/a> und <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">benutzerdefinierte<\/a> Funktionen unterschiedlich.<\/p>\n<p>Benutzerdefinierte Funktionen werfen einen <code>TypeError<\/code>, aber interne Funktionen verhalten sich unterschiedlich, abh\u00e4ngig von verschiedenen Bedingungen. Wie auch immer, das typische Verhalten ist, eine Warnung zu werfen und <code>null<\/code> zur\u00fcckzugeben. Siehe das folgende Beispiel in PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Dies w\u00fcrde zu folgender Warnung f\u00fchren:<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Wenn <code>strict_types<\/code> aktiviert ist, oder argument information Typen angibt, w\u00e4re das Verhalten anders. In solchen Szenarien wird der Typfehler erkannt und f\u00fchrt zu einem <code>TypeError<\/code>.<\/p>\n<p>Diese Situation w\u00fcrde zu einer Reihe von Problemen f\u00fchren, die in der <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">Issues-Sektion des RFC<\/a> gut erkl\u00e4rt sind.<\/p>\n<p>Um diese Inkonsistenzen zu beseitigen, <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">schl\u00e4gt dieser RFC vor<\/a>, die internen Parameter-Parsing-APIs so zu gestalten, dass sie immer einen <code>ThrowError<\/code> erzeugen, wenn ein Parametertyp nicht \u00fcbereinstimmt.<\/p>\n<p>In PHP 8 wirft der obige Code den folgenden Fehler aus:<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">throw Expression<\/h3>\n<p>In PHP ist <code>throw<\/code> eine <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">Anweisung<\/a>, daher ist es nicht m\u00f6glich, sie an Stellen zu verwenden, an denen nur ein <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">Ausdruck<\/a> erlaubt ist.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Dieser RFC<\/a> schl\u00e4gt vor, die <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\"><code>throw<\/code>-Anweisung<\/a> in einen Ausdruck umzuwandeln, so dass sie in jedem Kontext verwendet werden kann, wo Ausdr\u00fccke erlaubt sind. Zum Beispiel <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-4\/#arrow-functions\">arrow Funktionen<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">Null-Koaleszenz-Operator<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">tern\u00e4re und Elvis-Operatoren<\/a>, etc.<\/p>\n<p>Siehe die folgenden Beispiele aus dem RFC:<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\">Weak Maps<\/h3>\n<p>Eine Weak Map ist eine Sammlung von Daten (Objekten), in der Schl\u00fcssel schwach referenziert werden, was bedeutet, dass sie nicht daran gehindert werden, M\u00fcll zu sammeln.<\/p>\n<p>PHP 7.4 f\u00fcgte Unterst\u00fctzung f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-4\/#weakreferences\">schwache Referenzen<\/a> hinzu, um einen Verweis auf ein Objekt zu erhalten, was nicht verhindert, dass das Objekt selbst zerst\u00f6rt wird. Wie von Nikita Popov angemerkt,<\/p>\n<blockquote><p>&#8222;Rohe schwache Verweise sind f\u00fcr sich genommen nur von begrenztem Nutzen und Weak Maps werden in der Praxis viel h\u00e4ufiger verwendet. Es ist nicht m\u00f6glich, eine effiziente Weak Map zus\u00e4tzlich zu den PHP-Schwachen Referenzen zu implementieren, da die M\u00f6glichkeit, einen Zerst\u00f6rungs-Callback zu registrieren, nicht angeboten wird.&#8220;<\/p><\/blockquote>\n<p>Aus diesem Grund f\u00fchrt <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">dieser RFC<\/a> eine <code>WeakMap<\/code>-Klasse ein, um Objekte zu erstellen, die als Weak Map-Schl\u00fcssel verwendet werden, die zerst\u00f6rt und von der Weak Map entfernt werden k\u00f6nnen, wenn es keine weiteren Referenzen auf das Schl\u00fcsselobjekt gibt.<\/p>\n<p>In lang laufenden Prozessen w\u00fcrde dies Speicherlecks verhindern und die Performance verbessern. Siehe das folgende Beispiel aus dem RFC:<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Mit PHP 8 w\u00fcrde der obige Code das folgende Ergebnis erzeugen (<a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">siehe den Code in Aktion hier)<\/a>:<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Wenn du das Objekt entsperrst, wird der Schl\u00fcssel automatisch von der Weak Map entfernt:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Nun w\u00e4re das Ergebnis wie folgt:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>F\u00fcr eine genauere Betrachtung der Weak Maps siehe <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">RFC<\/a>. Der Vorschlag wurde einstimmig angenommen.<\/p>\n<h3 id=\"trailing-commas\">Nachkomma in Parameterliste<\/h3>\n<p>Nachkommas sind Kommas, die an Listen von Elementen in verschiedenen Kontexten angeh\u00e4ngt werden. PHP 7.2 f\u00fchrte die <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">Anh\u00e4ngung von Kommas in der Listensyntax<\/a> ein, PHP 7.3 f\u00fchrte die <a href=\"https:\/\/kinsta.com\/de\/blog\/php-7-3\/#trailing-comma-in-function-calls\">Anh\u00e4ngung von Kommas in Funktionsaufrufen<\/a> ein.<\/p>\n<p>PHP 8 f\u00fchrt in Parameterlisten mit Funktionen, Methoden und Abschl\u00fcssen nun auch <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">Nachkommas in Parameterlisten<\/a> ein, wie das folgende Beispiel zeigt:<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>Dieser Antrag wurde mit 58 zu 1 Stimmen angenommen.<\/p>\n<h3 id=\"class-syntax-on-objects\">Allow ::class syntax on objects<\/h3>\n<p>Um den Namen einer Klasse abzurufen, k\u00f6nnen wir die Syntax <code>Foo\\Bar::class<\/code> verwenden. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Dieser RFC<\/a> schl\u00e4gt vor, die gleiche Syntax auf Objekte auszudehnen, so dass es nun m\u00f6glich ist, den Namen der Klasse eines gegebenen Objekts zu holen, wie im folgenden Beispiel gezeigt:<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>Mit PHP 8 bietet <code>$object::class<\/code> das gleiche Ergebnis wie <code>get_class($object)<\/code>. Wenn <code>$object<\/code> kein Objekt ist, wirft es eine <code>TypeError<\/code>-Ausnahme aus.<\/p>\n<p>Dieser Vorschlag wurde einstimmig angenommen.<\/p>\n<h3 id=\"attributes\">Attributes v2<\/h3>\n<p>Attribute, auch als Annotationen bekannt, sind eine Form strukturierter Metadaten, die zur Angabe von Eigenschaften f\u00fcr Objekte, Elemente oder Dateien verwendet werden k\u00f6nnen.<\/p>\n<p>Bis PHP 7.4 waren Doc-Kommentare die einzige M\u00f6glichkeit, Metadaten zu Deklarationen von Klassen, Funktionen usw. hinzuzuf\u00fcgen. Jetzt f\u00fchrt der<a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\"> RFC Attributes v2<\/a> Attribute f\u00fcr PHP ein und definiert sie als eine Form von strukturierten, syntaktischen Metadaten, die zu Deklarationen von Klassen, Eigenschaften, Funktionen, Methoden, Parametern und Konstanten hinzugef\u00fcgt werden k\u00f6nnen.<\/p>\n<p>Attribute werden vor den Deklarationen, auf die sie sich beziehen, hinzugef\u00fcgt. Siehe die folgenden Beispiele aus dem RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\nclass Foo\n{\n\t&lt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&gt;\n\tpublic $x;\n\n\t&lt;&gt;\n\tpublic function foo(&lt;&gt; $bar) { }\n}\n\n$object = new &lt;&gt; class () { };\n\n&lt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&gt; function () { };\n\n$f3 = &lt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Attribute k\u00f6nnen vor oder nach einem Dok-Block-Kommentar hinzugef\u00fcgt werden:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\n\/** docblock *\/\n&lt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Jede Deklaration kann ein oder mehrere Attribute haben, und jedes Attribut kann einen oder mehrere zugeh\u00f6rige Werte haben:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Einen tieferen \u00dcberblick \u00fcber PHP-Attribute, Anwendungsf\u00e4lle und alternative Syntax findest du im <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC<\/a>.<\/p>\n<h3 id=\"named-arguments\">Benannte Argumente<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Benannte Argumente<\/a> bieten eine neue M\u00f6glichkeit, Argumente an eine Funktion in PHP zu \u00fcbergeben:<\/p>\n<blockquote><p>Benannte Argumente erm\u00f6glichen die \u00dcbergabe von Argumenten an eine Funktion, die auf dem Parameternamen und nicht auf der Parameterposition basiert.<\/p><\/blockquote>\n<p>Wir k\u00f6nnen benannte Argumente an eine Funktion \u00fcbergeben, indem wir einfach den Parameternamen vor ihrem Wert hinzuf\u00fcgen:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction(name: $value);<\/code><\/span><\/pre>\n<p>Wir d\u00fcrfen auch reservierte Schl\u00fcsselw\u00f6rter verwenden, wie das folgende Beispiel zeigt:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction(array: $value);<\/code><\/span><\/pre>\n<p>Aber es ist uns nicht erlaubt, einen Parameternamen dynamisch zu \u00fcbergeben. Der Parameter muss ein Bezeichner sein und <strong>die folgende Syntax ist nicht erlaubt<\/strong>:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">callFunction($name: $value);<\/code><\/span><\/pre>\n<p>Laut Nikita Popov, dem Autor dieses RFC, bieten die genannten Argumente mehrere Vorteile.<\/p>\n<p>Zun\u00e4chst einmal werden benannte Argumente uns helfen, verst\u00e4ndlicheren Code zu schreiben, weil ihre Bedeutung selbstdokumentierend ist. Das folgende Beispiel aus dem RFC ist selbsterkl\u00e4rend:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/span><\/pre>\n<p>Benannte Argumente sind auftragsunabh\u00e4ngig. Das bedeutet, dass wir nicht gezwungen sind, Argumente an eine Funktion in der gleichen Reihenfolge wie die Funktionssignatur zu \u00fcbergeben:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/span><\/pre>\n<p>Es ist auch m\u00f6glich, benannte Argumente mit Positionsargumenten zu kombinieren:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/span><\/pre>\n<p>Ein weiterer gro\u00dfer Vorteil von benannten Argumenten ist, dass sie es erlauben, nur die Argumente anzugeben, die wir tats\u00e4chlich \u00e4ndern wollen, und dass wir keine Standardargumente angeben m\u00fcssen, wenn wir Standardwerte nicht \u00fcberschreiben wollen. Das folgende Beispiel aus dem RFC macht dies deutlich:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/span><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Wenn du ein <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-entwickler-engagiert\/\">WordPress-Entwickler<\/a> bist<a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-entwickler-engagiert\/\">,<\/a> beachten bitte, dass zum Zeitpunkt des Verfassens dieses Artikels benannte Argumente zu <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-5-6\/#named-parameters\">Problemen mit der Abw\u00e4rtskompatibilit\u00e4t<\/a> f\u00fchren k\u00f6nnen<a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-5-6\/#named-parameters\">.<\/a> Verwende diese nicht ohne sorgf\u00e4ltige Tests in der Produktion.<\/p>\n<\/aside>\n\n<p>Benannte Argumente k\u00f6nnen mit <a href=\"#attributes\">PHP-Attributen<\/a> verwendet werden, wie das folgende Beispiel aus dem RFC zeigt:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/span><\/pre>\n<p>Die \u00dcbergabe von Positionsargumenten nach benannten Argumenten ist jedoch nicht erlaubt und f\u00fchrt zu einem Kompilierzeitfehler. Dasselbe passiert, wenn derselbe Parametername zweimal \u00fcbergeben wird.<\/p>\n<p>Benannte Argumente sind bei Klassendeklarationen besonders n\u00fctzlich, da Konstruktoren in der Regel eine gro\u00dfe Anzahl von Parametern haben und benannte Argumente eine &#8222;ergonomischere&#8220; Art der Deklaration einer Klasse bieten.<\/p>\n<p>F\u00fcr eine n\u00e4here Betrachtung der benannten Argumente, mit Einschr\u00e4nkungen, R\u00fcckw\u00e4rtsinkompatibilit\u00e4ten und mehreren Beispielen, siehe <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">RFC zu benannten Argumenten<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Nullsafe-Operator<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Dieser RFC<\/a> f\u00fchrt den nullsicheren Operator <code>$-&gt;<\/code> mit vollst\u00e4ndiger <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">Kurzschlussauswertung<\/a> ein.<\/p>\n<p>Bei der Kurzschlussbewertung wird der zweite Operator nur dann bewertet, wenn der erste Operator nicht auf <code>null<\/code> bewertet. Wenn ein Operator in einer Kette auf <code>null<\/code> auswertet, stoppt die Ausf\u00fchrung der gesamten Kette und wertet auf <code>null<\/code> aus.<\/p>\n<p>Betrachte die folgenden Beispiele aus dem RFC:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/span><\/pre>\n<p>Wenn <code>$a<\/code> null ist, wird die Methode <code>b()<\/code> nicht aufgerufen und <code>$foo<\/code> wird auf <code>null<\/code> gesetzt.<\/p>\n<p>Siehe den <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">nullsafe operator RFC<\/a> f\u00fcr zus\u00e4tzliche Beispiele, Ausnahmen und zuk\u00fcnftigen Anwendungsbereich.<\/p>\n<h3 id=\"string-to-number-comparison\">Saner String to Number-Vergleiche<\/h3>\n<p>In fr\u00fcheren PHP-Versionen hat PHP bei einem nicht strikten Vergleich zwischen Zeichenketten und Zahlen zun\u00e4chst die Zeichenkette in eine Zahl umgewandelt und dann den Vergleich zwischen ganzen Zahlen oder Flie\u00dfkommazahlen durchgef\u00fchrt. Auch wenn dieses Verhalten in verschiedenen Szenarien recht n\u00fctzlich ist, kann es zu falschen Ergebnissen f\u00fchren, die auch zu Bugs und\/oder Sicherheitsproblemen f\u00fchren k\u00f6nnen.<\/p>\n<p>Betrachte das folgende Beispiel aus dem RFC:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/span><\/pre>\n<p>PHP 8 f\u00fchrt <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">Saner-Zeichenketten in Zahlenvergleiche<\/a> ein, um Vergleiche von Zeichenketten mit Zahlen vern\u00fcnftiger zu machen. Mit den Worten von Nikita Popov,<\/p>\n<blockquote><p>Dieser RFC beabsichtigt, Zahlenvergleichen mit Zeichenketten ein vern\u00fcnftigeres Verhalten zu geben: Wenn du mit einer numerischen Zeichenfolge vergleichst, verwende einen Zahlenvergleich (wie jetzt). Andernfalls konvertiere die Zahl in eine Zeichenkette und verwenden einen Zeichenkettenvergleich.<\/p><\/blockquote>\n<p>Die folgende Tabelle vergleicht das Verhalten von Zeichenketten im Vergleich zu fr\u00fcheren PHP-Versionen und in PHP 8:<\/p>\n<pre>Comparison    | Before | After\n------------------------------\n 0 == \"0\"     | true   | true\n 0 == \"0.0\"   | true   | true\n <strong>0 == \"foo\"   | true   | false<\/strong>\n <strong>0 == \"\"      | true   | false<\/strong>\n42 == \"   42\" | true   | true\n<strong>42 == \"42foo\" | true   | false<\/strong><\/pre>\n<p>Lies mehr \u00fcber die vielen Auswirkungen dieser \u00c4nderung und wie sich die Vergleiche zwischen Strings und Nummern in PHP 8 \u00e4ndern, im offiziellen <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC von Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Saner numerische Zeichenketten<\/h3>\n<p>In PHP fallen Zeichenketten, die Zahlen enthalten, in <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">drei Kategorien<\/a>:<\/p>\n<ul>\n<li><strong>Numerische Zeichenfolgen:<\/strong> Zeichenfolgen, die eine Zahl enthalten, der optional Leerzeichen vorangestellt sind.<\/li>\n<li><strong>F\u00fchrende numerische Zeichenfolge:<\/strong> Zeichenfolgen, deren Anfangszeichen numerische Zeichenfolgen sind und deren Endzeichen nicht numerisch sind.<\/li>\n<li><strong>Nicht-numerische Zeichenfolge:<\/strong> Zeichenfolgen, die in keine der beiden vorherigen Kategorien fallen.<\/li>\n<\/ul>\n<p>Numerische Zeichenketten und vorangestellte numerische Zeichenketten werden je nach der durchgef\u00fchrten Operation unterschiedlich behandelt. Zum Beispiel:<\/p>\n<ul>\n<li><strong>Explizite Konvertierungen von Zeichenfolgen in Zahlen<\/strong> (d. h. <code>(int)<\/code> und <code>(float)<\/code> Casts) konvertieren numerische und f\u00fchrende numerische Zeichenfolgen in Zahlen. Die explizite Umwandlung einer nicht-numerischen Zeichenfolge in eine Zahl ergibt 0.<\/li>\n<li><strong>Implizite Konvertierungen von Zeichenketten in Zahlen<\/strong> (d.h. keine <code>strict_type<\/code>-Deklaration) f\u00fchren zu unterschiedlichen Ergebnissen f\u00fcr numerische und nicht-numerische Zeichenketten. Nicht-numerische Umwandlungen von Zeichenketten in Zahlen f\u00fchren zu einem <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> gibt nur f\u00fcr numerische Zeichenketten <strong>true<\/strong> zur\u00fcck.<\/li>\n<\/ul>\n<p>String-Offsets, arithmetische Operationen, Inkrement- und Dekrementoperationen, String-zu-String-Vergleiche und bitweise Operationen f\u00fchren ebenfalls zu unterschiedlichen Ergebnissen.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Dieser RFC<\/a> schl\u00e4gt vor:<\/p>\n<blockquote><p>Vereinheitliche die verschiedenen numerischen Zeichenfolgenmodi in einem einzigen Konzept: Nur numerische Zeichen, wobei sowohl f\u00fchrende als auch nachlaufende Leerzeichen erlaubt sind. Jeder andere Zeichenkettentyp ist nicht numerisch und f\u00fchrt zu TypeErrors, wenn er in einem numerischen Kontext verwendet wird.<\/p><\/blockquote>\n<blockquote><p>Das bedeutet, dass alle Zeichenfolgen, die derzeit den <strong>E_NOTICE<\/strong> &#8222;A non well formed numeric value encountered&#8220; ausgeben, in den <strong>E_WARNING<\/strong> &#8222;A non-numeric value encountered&#8220; umklassifiziert werden, es sei denn, die f\u00fchrende numerische Zeichenfolge enthielt nur am Ende Leerzeichen. Und die verschiedenen F\u00e4lle, die derzeit eine <strong>E_WARNING<\/strong> ausgeben, werden in <code>TypeError<\/code>s umgewandelt.<\/p><\/blockquote>\n<p>Einen tieferen \u00dcberblick \u00fcber numerische Zeichenketten in PHP 8 mit Codebeispielen, Ausnahmen und Abw\u00e4rtskompatibilit\u00e4tsproblemen findest du im <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a>.<\/p>\n<h3 id=\"match-expression\">\u00dcbereinstimmungs-Ausdruck v2<\/h3>\n<p>Der neue <code>match<\/code>-Ausdruck ist dem <code>switch<\/code> ziemlich \u00e4hnlich, aber mit einer sichereren Semantik und der M\u00f6glichkeit, Werte zur\u00fcckzugeben.<\/p>\n<p>Um den Unterschied zwischen den beiden Kontrollstrukturen zu verstehen, betrachte das folgende <code>switch<\/code>-Beispiel aus dem <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">switch (1) {\n\tcase 0:\n\t\t$result = 'Foo';\n\t\tbreak;\n\tcase 1:\n\t\t$result = 'Bar';\n\t\tbreak;\n\tcase 2:\n\t\t$result = 'Baz';\n\t\tbreak;\n}\n \necho $result;\n\/\/&gt; Bar<\/code><\/span><\/pre>\n<p>Wir k\u00f6nnen jetzt das gleiche Ergebnis wie im obigen Code mit dem folgenden <code>match<\/code> ausdruck erhalten:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">echo match (1) {\n\t0 =&gt; 'Foo',\n\t1 =&gt; 'Bar',\n\t2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/span><\/pre>\n<p>Ein gro\u00dfer Vorteil der Verwendung des neuen <code>match<\/code> ausdrucks besteht darin, dass w\u00e4hrend <code>switch<\/code> Werte lose vergleicht (<code>==<\/code>), was m\u00f6glicherweise zu unerwarteten Ergebnissen f\u00fchrt, bei <code>match<\/code> ist der Vergleich eine Identit\u00e4tspr\u00fcfung (<code>===<\/code>).<\/p>\n<p>Der <code>match<\/code> ausdruck kann auch mehrere durch Komma getrennte Ausdr\u00fccke enthalten, was eine pr\u00e4gnantere Syntax erm\u00f6glicht (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">quelle<\/a>):<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">$result = match ($x) {\n\t\/\/ This match arm:\n\t$a, $b, $c =&gt; 5,\n\t\/\/ Is equivalent to these three match arms:\n\t$a =&gt; 5,\n\t$b =&gt; 5,\n\t$c =&gt; 5,\n};<\/code><\/span><\/pre>\n<p>Weitere Beispiele und Anwendungsf\u00e4lle findest du <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">im Match expression v2 RFC<\/a> und in der <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">PHP-Dokumentation<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Strengere Typpr\u00fcfungen f\u00fcr arithmetische\/bitweise Operatoren<\/h3>\n<p>In fr\u00fcheren Versionen von PHP war es erlaubt, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">arithmetische<\/a> und <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitweise<\/a> Operatoren auf ein Array, eine Ressource oder ein nicht \u00fcberladenes Objekt anzuwenden. Wie auch immer, das Verhalten war manchmal inkonsistent.<\/p>\n<p>In <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">diesem RFC<\/a> zeigt Nikita Popov anhand eines einfachen Beispiels, wie unvern\u00fcnftig dieses Verhalten sein k\u00f6nnte:<\/p>\n<pre><span style=\"color: #ff0000\"><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/span><\/pre>\n<p>Nikita erkl\u00e4rt, wie die Anwendung eines arithmetischen oder bitweisen Operators auf Arrays, Ressourcen oder nicht \u00fcberladene Objekte zu <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">unterschiedlichen Ergebnissen f\u00fchrte<\/a>:<\/p>\n<blockquote><p>Operatoren +, -, *, \/, **:<\/p>\n<ul>\n<li>Fehlerausnahme auf Array-Operand werfen. (Ausschlie\u00dfen von +, wenn beide Operanden Array-Operanden sind).<\/li>\n<li>Wandelt einen Ressourcenoperanden stillschweigend in die Ressourcen-ID als Ganzzahl um.<\/li>\n<li>Konvertiert einen Objektoperanden in den ganzzahligen Wert Eins, w\u00e4hrend eine Benachrichtigung ausgegeben wird.<\/li>\n<\/ul>\n<p>Operatoren %, &lt;&lt;, &gt;&gt;, &#038;, |, ^:<\/p>\n<ul>\n<li>Wandelt einen Array-Operanden stillschweigend in die Ganzzahl Null um, wenn er leer ist, oder in die Ganzzahl Eins, wenn er nicht leer ist.<\/li>\n<li>Wandelt einen Ressourcenoperanden stillschweigend in die Ressourcen-ID als Ganzzahl um.<\/li>\n<li>Konvertiert einen Objektoperanden in den ganzzahligen Wert Eins, w\u00e4hrend eine Benachrichtigung ausgegeben wird.<\/li>\n<\/ul>\n<p>Operator ~:<\/p>\n<ul>\n<li>Wirft eine Fehlerausnahme f\u00fcr Array-, Ressourcen- und Objektoperanden.<\/li>\n<\/ul>\n<p>Operatoren ++ und &#8211;:<\/p>\n<ul>\n<li>Schweigend nichts tun, wenn der Operand ein Array, eine Ressource oder ein Objekt ist.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Mit PHP 8 \u00e4ndern sich die Dinge und das Verhalten ist f\u00fcr alle arithmetischen und bitweisen Operatoren gleich:<\/p>\n<p><strong>Wirf eine<\/strong> <code>TypeError<\/code>&#8211;<strong>Ausnahme f\u00fcr Array-, Ressourcen- und Objektoperanden.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Neue PHP-Funktionen<\/h2>\n<p>PHP 8 bringt mehrere neue Funktionen in die Sprache:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Vor PHP 8 waren <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> und <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> die typischen Optionen f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-entwickler-engagiert\/\">Entwickler<\/a>, um nach einer Nadel innerhalb einer gegebenen Zeichenkette zu suchen. Das Problem ist, dass beide Funktionen nicht als sehr intuitiv angesehen werden und ihre Verwendung f\u00fcr neue PHP-Entwickler verwirrend sein kann. Siehe das folgende Beispiel:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Im obigen Beispiel haben wir den Vergleichsoperator <code>!==<\/code> verwendet, der auch pr\u00fcft, ob zwei Werte vom gleichen Typ sind. Dies verhindert, dass wir einen Fehler erhalten, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">wenn die Position der Nadel 0 ist:<\/a><\/p>\n<blockquote><p>&#8222;Diese Funktion kann den booleschen <strong>FALSE<\/strong> zur\u00fcckgeben, kann aber auch einen nicht-booleschen Wert zur\u00fcckgeben, der als <strong>FALSE<\/strong> gewertet wird. [&#8230;] Verwende den Operator ===, um den R\u00fcckgabewert dieser Funktion zu testen.&#8220;<\/p><\/blockquote>\n<p>Dar\u00fcber hinaus bieten dir mehrere Frameworks Hilfsfunktionen an, um nach einem Wert innerhalb einer gegebenen Zeichenfolge zu suchen (siehe <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">Laravel-Helfer-Dokumentation<\/a> als Beispiel).<\/p>\n<p>Nun schl\u00e4gt <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">dieser RFC<\/a> die Einf\u00fchrung einer neuen Funktion vor, die es erlaubt, innerhalb einer Zeichenkette zu suchen: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Seine Verwendung ist ziemlich einfach. <code>str_contains<\/code> pr\u00fcft, ob <code>$needle<\/code> in <code>$haystack<\/code> gefunden wird und gibt entsprechend <code>true<\/code> oder <code>false<\/code> zur\u00fcck.<\/p>\n<p>Dank <code>str_contains<\/code> k\u00f6nnen wir also den folgenden Code schreiben:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Der besser lesbar und weniger fehleranf\u00e4llig ist (siehe diesen Code in Aktion <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">hier<\/a>).<\/p>\n<p>Zum Zeitpunkt des Verfassens dieses Artikels unterscheidet <code>str_contains<\/code> zwischen Gro\u00df- und Kleinschreibung, aber das k\u00f6nnte sich in Zukunft \u00e4ndern.<\/p>\n<p>Der Vorschlag <code>str_contains<\/code> wurde mit 43 zu 9 Stimmen angenommen.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() und str_ends_with()<\/h3>\n<p>Zus\u00e4tzlich zur Funktion <code>str_contains<\/code> erm\u00f6glichen zwei neue Funktionen die Suche nach einer Nadel innerhalb einer gegebenen Zeichenfolge: <code>str_starts_with<\/code> und <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Diese neuen Funktionen<\/a> pr\u00fcfen, ob eine gegebene Zeichenkette mit einer anderen Zeichenkette beginnt oder endet:<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Beide Funktionen geben <code>false<\/code> zur\u00fcck, wenn <code>$needle<\/code> l\u00e4nger als <code>$haystack<\/code> ist.<\/p>\n<p>Laut Will Hudgins, dem Autor dieses RFC,<\/p>\n<blockquote><p>&#8222;Die Funktionalit\u00e4t <code>str_starts_with<\/code> und <code>str_ends_with<\/code> wird so h\u00e4ufig ben\u00f6tigt, dass viele <a href=\"https:\/\/kinsta.com\/de\/blog\/php-frameworks\/\">wichtige PHP-Frameworks<\/a> sie unterst\u00fctzen, darunter <a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony<\/a>, <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\">Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP<\/a> und <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>.&#8220;<\/p><\/blockquote>\n<p>Dank ihnen konnten wir nun die Verwendung suboptimaler und weniger intuitiver Funktionen wie <code>substr<\/code>, <code>strpos<\/code> vermeiden. Bei beiden Funktionen wird zwischen Gro\u00df- und Kleinschreibung unterschieden:<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Du kannst diesen Code <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">hier<\/a> in Aktion sehen.<\/p>\n<p>Dieser RFC wurde mit 51 zu 4 Stimmen genehmigt.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> ist eine <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">neue PHP-Funktion<\/a>, die den Typ einer Variablen zur\u00fcckgibt. Die neue Funktion funktioniert ziemlich \u00e4hnlich wie die <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\"><code>gettype<\/code>-Funktion<\/a>, aber <code>get_debug_type<\/code> liefert native Typnamen zur\u00fcck und l\u00f6st Klassennamen auf.<\/p>\n<p>Das ist eine gute Verbesserung f\u00fcr die Sprache, da <code>gettype()<\/code> f\u00fcr die Typ\u00fcberpr\u00fcfung nicht n\u00fctzlich ist.<\/p>\n<p>Der RFC bietet dir zwei n\u00fctzliche Beispiele, um den Unterschied zwischen der neuen <code>get_debug_type()<\/code>-Funktion und <code>gettype()<\/code> besser zu verstehen. Das erste Beispiel zeigt <code>gettype<\/code> bei der Arbeit:<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Mit PHP 8 k\u00f6nnten wir stattdessen <code>get_debug_type<\/code> verwenden:<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>Die folgende Tabelle zeigt die R\u00fcckgabewerte von <code>get_debug_type<\/code> und <code>gettype<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Value<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>&#8222;WordPress&#8220;<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>A class with name &#8222;Foo\\Bar&#8220;<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>An anonymous class<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">Zus\u00e4tzliche RFCs<\/h2>\n<p>Hier ist eine kurze Liste der zus\u00e4tzlichen genehmigten Verbesserungen, die mit PHP 8 kommen:<\/p>\n<ol>\n<li><strong>Stringable Interface<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">Dieser RFC<\/a> f\u00fchrt ein Stringable Interface ein, das automatisch zu Klassen hinzugef\u00fcgt wird, die die <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\"><code>__to String()<\/code>-Methode<\/a> implementieren. Das Hauptziel hier ist die Verwendung des Union-Typs string|Stringable.<\/li>\n<li><strong>Neue DOM-Lebensstandard-APIs in ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">dieser RFC<\/a> schl\u00e4gt vor, den aktuellen <a href=\"https:\/\/dom.spec.whatwg.org\/\">DOM-Lebensstandard<\/a> in die <a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">PHP-DOM-Erweiterung<\/a> zu implementieren, indem neue Interfaces und \u00f6ffentliche Eigenschaften eingef\u00fchrt werden.<\/li>\n<li><strong>Statischer R\u00fcckgabetyp<\/strong>: PHP 8 f\u00fchrt die Verwendung von <code>static<\/code> als R\u00fcckgabetyp neben <code>self<\/code> und <code>parent<\/code> Typen ein.<\/li>\n<li><strong>Variable Syntax Tweaks<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">dieser RFC<\/a> l\u00f6st einige verbleibende Inkonsistenzen in der Variablensyntax von PHP auf.<\/li>\n<\/ol>\n\n<h2>Zusammenfassung<\/h2>\n<p>Was f\u00fcr eine Fahrt! In diesem Beitrag haben wir die interessantesten Optimierungen und Funktionen von PHP 8 behandelt. Die am meisten erwartete davon ist sicherlich der Just in Time-Compiler, aber PHP 8 bietet noch viel mehr.<\/p>\n<p>Setze dir f\u00fcr diesen Blog-Beitrag ein Lesezeichen f\u00fcr die zuk\u00fcnftige Verwendung. \ud83e\udd13<\/p>\n<p>Jetzt bist du an der Reihe: Bist du bereit, die neuen PHP-Funktionen zu testen? Welche ist deine Lieblingsfunktion? Schreibe eine Zeile in den Kommentarbereich unten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 wurde am 26. November 2020 offiziell f\u00fcr die allgemeine Verf\u00fcgbarkeit freigegeben! Dieses neue gr\u00f6\u00dfere Update bringt eine ganze Reihe von Optimierungen und leistungsstarken Funktionen &#8230;<\/p>\n","protected":false},"author":36,"featured_media":35010,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[38,28],"topic":[971],"class_list":["post-35005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","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 (Funktionen, Verbesserungen und der JIT-Compiler)<\/title>\n<meta name=\"description\" content=\"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!\" \/>\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\/\" \/>\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 (Funktionen, Verbesserungen und der JIT-Compiler)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/php-8\/\" \/>\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=\"2020-05-27T10:28:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-21T08:17:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"31\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\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)\",\"datePublished\":\"2020-05-27T10:28:55+00:00\",\"dateModified\":\"2023-08-21T08:17:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/\"},\"wordCount\":5197,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"WordPress Entwicklung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/\",\"name\":\"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\",\"datePublished\":\"2020-05-27T10:28:55+00:00\",\"dateModified\":\"2023-08-21T08:17:57+00:00\",\"description\":\"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/php-8\/#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 (Funktionen, Verbesserungen und der JIT-Compiler)\"}]},{\"@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\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)","description":"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!","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\/","og_locale":"de_DE","og_type":"article","og_title":"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)","og_description":"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!","og_url":"https:\/\/kinsta.com\/de\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2020-05-27T10:28:55+00:00","article_modified_time":"2023-08-21T08:17:57+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Carlo Daniele","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)","datePublished":"2020-05-27T10:28:55+00:00","dateModified":"2023-08-21T08:17:57+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/"},"wordCount":5197,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","keywords":["php","webdev"],"articleSection":["WordPress Entwicklung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/","url":"https:\/\/kinsta.com\/de\/blog\/php-8\/","name":"Was ist neu in PHP 8 (Funktionen, Verbesserungen und der JIT-Compiler)","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","datePublished":"2020-05-27T10:28:55+00:00","dateModified":"2023-08-21T08:17:57+00:00","description":"PHP 8 wird voraussichtlich am 03. Dezember 2020 ver\u00f6ffentlicht. Es wird neue Funktionen, Verwerfungen und einen Leistungsschub bringen. Schau dir an, was es Neues in PHP 8 gibt!","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2020\/05\/php-8.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/php-8\/#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 (Funktionen, Verbesserungen und der JIT-Compiler)"}]},{"@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\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/de\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/35005","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\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=35005"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/35005\/revisions"}],"predecessor-version":[{"id":41425,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/35005\/revisions\/41425"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/translations\/se"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/35005\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/35010"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=35005"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=35005"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=35005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}