PHP 8 Major Update
Alle Infos zur neuen PHP Version
PHP stellt eine sehr beliebte Programmiersprache für Webanwendungen und damit eine der wichtigsten Technologien des Internets dar.
Mit PHP ist es möglich, dynamische Internetseiten serverseitig zu programmieren. Die Seiten werden bei jedem Abruf neu zusammengestellt – häufig durch den Abruf der Inhalte aus einer Datenbank. Laut W3Techs nimmt PHP in diesem Segment einen Marktanteil von rund 80 % ein. Das bedeutet, dass die große Mehrheit der Internetseiten auf dieser Technik beruht.
Am 26. November 2020 wurde die Version PHP 8 eingeführt. Das PHP 8 Release bringt einige wichtige Änderungen und zahlreiche neue Möglichkeiten für die Gestaltung einer Website mit.
1. Was bedeutet das Erscheinen einer neuen PHP-Version?
Zahlreiche Anwender, die PHP für die Gestaltung ihrer Programme verwenden, kennen die internen Abläufe auf dem Server nicht und haben daher auch keine genaue Vorstellung davon, was es bedeutet, wenn eine neue PHP-Version erscheint.
Sie verwenden lediglich die Befehle, die sie hierfür erlernt haben, fügen sie in ihre Seite ein und laden diese dann auf den Server hoch. Wenn sie daraufhin ihre Seite aufrufen, wird diese korrekt ausgegeben.
Die Prozesse, die hierbei im Hintergrund ablaufen, werden vollkommen automatisch durchgeführt. Daher ist es nicht notwendig, sich hierum zu kümmern. Um zu verstehen, welche Veränderungen eine neue PHP-Version mit sich bringt, ist es jedoch wichtig, diesen Vorgang etwas näher zu beleuchten.
Wenn Sie ein PHP-Programm erstellen, verwenden Sie für den Code Buchstaben, Ziffern und einige weitere Zeichen. Im Grunde handelt es sich hierbei jedoch um ein Text-Dokument. Der Computer kann dieses Programm nicht direkt ausführen.
Wenn Sie ein Programm ausführen, werden dem Prozessor nacheinander mehrere Befehle in einem Binärcode übermittelt. Diese kann der Prozessor dann bearbeiten. Jeder von ihnen zieht ein genau vorgegebenes Ergebnis nach sich. Hierbei spricht man von Maschinensprache.
Es gibt Programmiersprachen, bei denen die verfügbaren Befehle genau den Befehlen entsprechen, die an den Computer übermittelt werden. Hierbei handelt es sich um Assembler-Sprachen.
Bei PHP handelt es sich hingegen um eine höhere Programmiersprache. Das bedeutet, dass ein Befehl der Programmiersprache häufig einer größeren Anzahl an Befehlen in der Maschinensprache entspricht.
Aus diesem Grund ist hierfür ein Übersetzungsprozess notwendig. Vor der Ausführung muss der Programmcode in die Maschinensprache übertragen werden. Hierfür kommt eine spezielle Software zum Einsatz – im Fall von PHP der PHP-Interpreter. Dieser ist normalerweise bereits auf dem Server installiert, sodass Sie sich damit als Anwender nicht auseinandersetzen müssen.
Wenn nun eine neue PHP-Version erscheint, bedeutet das, dass eine Aktualisierung am PHP-Interpreter vorgenommen wurde. Das kann Auswirkungen auf zwei verschiedenen Ebenen haben.
Zum einen besteht die Möglichkeit, die internen Prozesse des Interpreters zu optimieren. Das kann die Performance beim Übersetzungsprozess verbessern.
Zum anderen ist es möglich, die Regeln der Programmiersprache anzupassen. Der Interpreter kontrolliert den Code des Programms. Wenn Sie hierbei beispielsweise die Syntaxregeln missachtet oder Befehle falsch verwendet haben, kann der Interpreter das Programm nicht ausführen – es kommt zu einem Fehler. Bei einer neuen PHP-Version ist es üblich, auch die Befehle, die der Interpreter akzeptiert, zu überarbeiten. Das dient dazu, bisherige Fehler zu vermeiden, die Programmiersprache zu modernisieren und die Programmgestaltung zu vereinfachen.
2. Die neuen PHP 8 Features
In den folgenden Abschnitten erfahren Sie mehr über die Änderungen, mit denen die neue PHP Hauptversion kommt. Sie erhalten einen Überblick darüber, welche Verbesserungen PHP 8 mit sich bringt und welche neuen Befehle Sie verwenden können.
Außerdem wird aufgezeigt, dass einige Ausdrücke, die bislang erlaubt waren, mit PHP 8 abgeschafft werden. Das führt dazu, dass keine Abwärtskompatibilität besteht.
- JIT-Compiler: bessere Performance für PHP-Programme
- Named Arguments: Übergabe von Parametern mit einer Bezeichnung
- Inkompatible Signaturen bei überschriebenen Methoden
- Union Types: unterschiedliche Datentypen verwenden
- Neuer validierter Return Type: static
- Weak Maps für eine Reduzierung des Ressourcenbedarfs
- Vereinheitlichung der Syntax bei Ausgabe der Klassennamen
- Einfache Konvertierung zwischen verschiedenen Datums- und Zeitangaben
- Änderungen bei Arrays mit negativem Index
- Constructor Property Promotion
- Neue Funktion str_contains()
JIT-Compiler: bessere Performance für PHP-Programme
Die wohl wichtigsten Neuerung bei PHP 8 ist die Einführung des JIT-Compilers. Dieser beeinflusst die internen Strukturen des Übersetzungsprozesses – nicht jedoch die Befehle, die die Programmiersprache akzeptiert. Dennoch könnte diese Neuerung einen erheblichen Einfluss auf die Programmgestaltung mit PHP haben. Um diesen Sachverhalt genauer zu erklären, ist es wieder notwendig, etwas weiter auszuholen.
Im vorigen Abschnitt kam bereits zur Sprache, dass es notwendig ist, ein Computerprogramm in die Maschinensprache zu übertragen, bevor es sich ausführen lässt. Hierfür gibt es grundsätzlich zwei Alternativen.
Die erste Möglichkeit besteht darin, den Code ein einziges Mal zu übersetzen und daraufhin abzuspeichern. Durch diesen Vorgang entsteht ein ausführbares Programm. Dieses kann daraufhin beliebig oft ausgeführt werden, ohne dass es erforderlich ist, den Übersetzungsprozess erneut auszuführen. Das sorgt für eine gute Performance. Beispiele für Programmiersprachen, die diese Vorgehensweise verwenden, sind C und C++.
PHP ist hingegen eine interpretierte Programmiersprache. Das hat zur Folge, dass der Code bei jeder Ausführung erneut übersetzt wird. Dafür sind erhebliche Ressourcen notwendig. Außerdem nimmt dieser Übersetzungsprozess einige Zeit in Anspruch, sodass die Performance hierbei leider vergleichsweise schlecht ist. Dieser Nachteil wird jedoch in Kauf genommen, um eine hohe Plattformunabhängigkeit zu garantieren. Während ausführbare Programme stets an das Betriebssystem gebunden sind, für das sie erstellt wurden, können Sie ein PHP-Programm auf jedem beliebigen Rechner ausführen – vorausgesetzt, dass darauf ein PHP-Interpreter installiert ist.
Dennoch bemühen sich die Entwickler der Programmiersprache darum, diesen Nachteil so gut wie möglich zu beheben. Die Einführung des JIT-Compilers trägt hierzu bei. Um dessen Funktionsweise zu verstehen, ist es zunächst wichtig, den bisherigen Übersetzungsprozess zu beschreiben. Dieser besteht aus einem vierstufigen Vorgang.
Der erste Schritt besteht in der Tokenisierung. Dabei werden die einzeln Buchstaben, Ziffern und Symbole zu sinngebenden Einheiten zusammengefasst. Auf diese Weise erkennt der Interpreter beispielsweise einzelne Variablen und Befehle.
Der nächste Schritt besteht im Parsen. Dabei wird überprüft, ob alle Syntaxregeln befolgt wurden. Außerdem erstellt der Interpreter eine hierarchische Struktur des Quellcodes. Diese wird als Abstract Syntax Tree (AST) bezeichnet.
Daraufhin kommt es zur Kompilierung. PHP verwendet hierfür einen Zwischencode – die low-level Zend Opcodes. Diese weisen zwar bereits erhebliche Ähnlichkeiten zur Maschinensprache auf. Dennoch ist dieser Code noch nicht ausführbar.
Dieser Schritt erfolgt dann erst zum Schluss des Übersetzungsprozesses. Hierbei werden die Opcodes auf der Zend VM ausgeführt. Diese überträgt sie in die Maschinensprache und gibt die entsprechenden Befehle direkt an die CPU weiter.
Ein wichtiger Schritt, um diesen Prozess zu beschleunigen, erfolgte mit der Einführung von PHP 5.5. Seit dieser Version ist die OPcache-Erweiterung verfügbar. Diese speichert den Opcode nach dem Kompilieren in einem Cache ab. Wenn Sie das Programm erneut ausführen, ist es daher nicht notwendig, die ersten drei Schritte erneut auszuführen. Der Interpreter steigt direkt bei der Ausführung auf der Zend VM ein. Das hat eine erhebliche Beschleunigung bei der Ausführung zur Folge.
Mit PHP 8 kommt nun der JIT-Compiler ins Spiel. Diese Funktionsweise ist allerdings nur optional. Das bedeutet, dass es über die Server-Einstellungen möglich ist, vorzugeben, ob der JIT-Compiler für die Ausführung verwendet werden soll oder nicht.
In diesem Artikel ist es nicht möglich, dessen Funktionsweise detailliert darzustellen. Allerdings sollen die groben Strukturen vorgestellt werden.
Die Abkürzung JIT steht für "Just in Time". Das bedeutet, dass der Compiler seine Arbeit erledigt, während der Interpreter das Programm ausführt. Die Grundannahme, die hinter dem JIT-Compiler steht, besteht darin, dass insbesondere bei längeren Anwendungen verschiedene Programmteile mehrfach ausgeführt werden. Beim bisherigen Übersetzungsprozess werden die entsprechenden Bereiche jedes Mal aufs Neue übersetzt. Das nimmt erhebliche Ressourcen in Anspruch.
Der JIT-Compiler verwendet nun jedoch ein Monitor-System, mit dessen Hilfe er den Code überwacht. Erkennt er dabei eine Stelle, die mehrfach ausgeführt wird, übersetzt er diesen Bereich direkt in die Maschinensprache und speichert ihn ab. Wenn es nun notwendig ist, ihn nochmals auszuführen, übersetzt der Interpreter ihn nicht erneut. Stattdessen ruft er die Stelle ab, die der JIT-Compiler zuvor in die Maschinensprache übersetzt
und abgespeichert hat. Dafür sind deutlich weniger Ressourcen notwendig. Auf diese Weise kann der JIT-Compiler die Performance deutlich erhöhen.
Die Auswirkungen des JIT-Compilers
Für die meisten Webseitenbetreiber und PHP-Programmierer ist nicht nur die Funktionsweise des neuen JIT-Compilers von Interesse, sondern in erster Linie seine Auswirkungen auf die tägliche Arbeit. Hierbei ist festzustellen, dass dieser zu einer deutlich schnelleren Ausführung von PHP-Programmen führt.
Der Informatiker Pedro Escudero hat ein Experiment zur Performance von PHP 8 durchgeführt. Dabei hat er ein PHP-Script mit unterschiedlichen PHP-Versionen jeweils 100 Mal ausgeführt und jeweils die durchschnittliche Bearbeitungszeit ermittelt. Dabei kam er zu den folgenden Ergebnissen:
PHP 5.3 | PHP 7.4 | PHP 8 (ohne JIT) | PHP 8 (mit JIT) |
---|---|---|---|
0.64574 s | 0.10254 s | 0.09822 s | 0.04459 s |
Diese Werte zeigen zunächst nochmals, welche erhebliche Verbesserung der Performance bereits zwischen den Versionen 5 und 7 liegt. Das liegt zu einem großen Teil an der Einführung der Opcodes.
Für die neueste Version ist jedoch der Übergang zwischen PHP 7.4 und PHP 8 von Interesse. Wenn der JIT-Compiler nicht aktiviert ist, kommt es hierbei nur zu einer geringfügigen Verbesserung der Ausführungszeit. Wenn diese Funktion jedoch genutzt wird, ist es möglich, diesen Wert mehr als zu halbieren. Das zeigt eindrücklich, wie groß die Verbesserung der Performance durch dieses Tool ist.
Die deutlich verbesserte Performance führt nicht nur dazu, dass mit PHP erstellte Internetseiten fortan schneller zur Verfügung stehen. Sie könnte auch einen erheblichen Einfluss auf die Programmgestaltung haben.
Bei Anwendungen, bei denen eine hohe Performance sehr wichtig ist, besteht eine gängige Praxis bisher darin, besonders rechenintensive Programmteile in einer anderen Programmiersprache zu verfassen – beispielsweise mit C oder C++. Auf diese Weise werden ausführbare Programmteile erzeugt, die direkt in Maschinensprache vorliegen. Das PHP-Programm kann diese daraufhin nutzen.
Sollte sich die erhebliche Leistungssteigerung durch das PHP 8 Release in der Praxis bestätigen, wird es immer seltener notwendig werden, diese Technik umzusetzen. Dadurch ist es möglich, das komplette Programm in PHP zu verfassen und dennoch eine akzeptable Ausführungsgeschwindigkeit zu erzielen. Das reduziert den Aufwand und die Komplexität bei der Programmgestaltung deutlich.
Für die meisten Webseitenbetreiber besteht die entscheidende Frage jedoch darin, wie sich diese Änderung auf Alltagsanwendungen wie WordPress oder andere Content Management Systeme auswirkt. Diese Programme kommen weltweit millionenfach zum Einsatz und stellen einen der wesentlichen Gründe für die hohe Verbreitung von PHP dar.
Hierbei scheint die Verbesserung bislang nur geringe Auswirkungen zu haben. Gründe dafür könnten sein, dass weitere Prozesse wie Datenbankabfragen oder HTTP-Anfragen die Performance beeinträchtigen. Das PHP-Entwicklerteam will dieses Problem jedoch im Auge behalten und an Lösungen dafür arbeiten.
Nach der Vorstellung der Änderungen bei der internen Funktionsweise des PHP-Interpreters befassen sich die folgenden Abschnitte mit den neuen Befehlen, die die Version PHP 8 mit sich bringt.
Auch hierbei kam es zu umfangreichen Änderungen, von denen sich einige sicherlich auf die tägliche Arbeit der PHP-Programmierer auswirken werden.
Named Arguments: Übergabe von Parametern mit einer Bezeichnung
Eine der wichtigsten Neuerungen besteht in der Einführung von Named Arguments – auch als Named Parameters bezeichnet.
Wenn Sie eine Funktion oder eine Methode in PHP erstellen, können Sie dieser bei ihrem Aufruf Werte übergeben. Diese Werte können Sie dann innerhalb der Funktion oder Methode für weitere Berechnungen verwenden. Dabei sind Sie nicht auf einen einzigen Übergabewert beschränkt. Sie können auch mehrere Werte aufnehmen.
Die folgende Funktion dient dazu, dies an einem kleinen Beispiel zu verdeutlichen. Sie nimmt zwei Werte auf, multipliziert sie mit unterschiedlichen Zahlen und gibt die Summe als Ergebnis aus:
function fun ($x, $y)
{
return $x * 4 + $y * 6;
}
echo fun(2,3);
Bei den bisherigen PHP-Versionen ist es notwendig, die Reihenfolge beim Aufruf der Funktion genau einzuhalten. Im Beispielprogramm wird etwa der Wert 2, der zuerst angegeben wird, der Variable $x zugeordnet. Die Variable $y erhält hingegen den zweiten Wert – also 3.
Mit PHP 8 ist es nun möglich, beim Aufruf der Funktion vorzugeben, welcher Variable die angegebenen Werte zugeordnet werden sollen. Das gibt Ihnen beispielsweise die Möglichkeit, die Reihenfolge umzukehren:
echo fun(y: 2, x: 3);
Auf diese Weise erhält die Variable $y den Wert 2 und die Variable $x den Wert 3, obwohl diese Werte in der umgekehrten Reihenfolge genannt werden.
Bei diesem Beispiel bringt die Verwendung von Named Arguments jedoch keine großen Vorteile. Es wäre genauso gut möglich, die Werte in der richtigen Reihenfolge zu nennen.
Interessant wird diese Möglichkeit jedoch, wenn Sie mit Standardwerten arbeiten. Diese machen es möglich, den Variablen einen bestimmten Wert zuzuweisen. Diesen sollen sie annehmen, wenn Sie beim Aufruf der Funktion hierfür keine Vorgaben machen:
function fun ($x = 4, $y = 2)
{
return $x * 4 + $y * 6;
}
echo fun();
In diesem Beispiel wird die Funktion ohne Übergabewerte aufgerufen. Daher nehmen die Variablen die vorgegebenen Standardwerte an – also x 4 und y 2. Häufig ist es hierbei gewünscht, nur für eine Variable einen individuellen Wert vorzugeben und für die andere Variable den Standardwert zu verwenden.
Bei den bisherigen PHP-Versionen werden die Werte jedoch stets genau in der vorgegebenen Reihenfolge vorgegeben. Wenn Sie nur einen Wert angeben, wird dieser der ersten Variable zugeordnet. Die zweite Variable erhält dann den Standardwert. Es ist nicht möglich, für die erste Variable den Standardwert zu verwenden und einen individuellen Wert für die zweite Variable vorzugeben.
Named Arguments beheben dieses Problem nun. Durch die Nennung des Bezeichners können Sie vorgeben, dass der Übergabewert der zweiten (oder einer beliebigen anderen) Variable zugeordnet werden soll. So können Sie den Wert für die erste Variable offenlassen, sodass diese den Standardwert annimmt:
echo fun(y: 2);
Inkompatible Signaturen bei überschriebenen Methoden
Der nächste Veränderung bezieht sich auf eine Anpassung der Verhaltensweise bei der Vererbung bei den bisherigen PHP-Versionen. Wenn Sie eine Methode in einer Klasse erstellen, wird diese automatisch vererbt, wenn Sie eine neue Klasse davon ableiten.
Allerdings besteht auch die Möglichkeit, die bisherigen Methode zu überschreiben. Hierfür müssen Sie lediglich in der abgeleiteten Klasse eine Methode mit dem gleichen Namen definieren. Da in PHP die Typisierung dynamisch erfolgt, ist es hierbei eigentlich nicht notwendig, einen Datentyp für die Übergabewerte anzugeben. Dennoch ist dies sinnvoll, um fehlerhafte Berechnungen durch inkompatible Datentypen zu vermeiden.
Wenn Sie nun eine Methode überschreiben, bei der ein Datentyp vorgegeben ist, sollten Sie auch für die neue Methode den gleichen Datentyp verwenden. Das sorgt für einheitliche Strukturen im Programm. Die bisherigen PHP-Versionen waren in dieser Hinsicht jedoch etwas inkonsequent. Das soll das folgende Codebeispiel zeigen:
class Klasse1
{
public function methode(int $a) {}
}
class Klasse2 extends Klasse1
{
public function methode(string $a) {}
}
Wenn Sie diesen Code mit einem bisherigen PHP-Interpreter ausführen, erscheint lediglich eine Warnmeldung. Die Ausführung des Programms ist jedoch trotz der unterschiedlichen Datentypen möglich. PHP 8 ist in dieser Hinsicht konsequenter und erzeugt eine Fehlermeldung.
Union Types: unterschiedliche Datentypen verwenden
Auch die folgende Änderung bezieht sich auf die Vorgabe von Datentypen für Methoden, Funktionen und zusätzlich auch für Klasseneigenschaften. Diese ist wie bereits dargestellt zwar optional, doch kann die Nennung eine Verarbeitung fehlerhafter Werte unterdrücken. Im Zweifelsfall ist es besser, das Programm direkt abzubrechen, statt falsche Werte weiterhin zu verwenden.
Als Beispiel hierfür dient eine Funktion, die das Quadrat des übergebenen Werts berechnet, dieses dann um 2 erhöht und den Wert daraufhin zurückgibt:
function fun ($zahl)
{
return $zahl * $zahl + 2;
}
Dabei liegt es auf der Hand, dass diese Funktion nur dann ordnungsgemäß funktioniert, wenn Sie ihr eine Zahl übergeben. Nun können Sie jedoch auch einmal ausprobieren, was passiert, wenn Sie stattdessen eine Zeichenkette verwenden:
echo fun("Hallo!");
In diesem Fall erscheint zwar eine Warnmeldung. Das Programm wird aber dennoch weiterhin ausgeführt. Die Zeichenkette wird als die Zahl 0 interpretiert. Daher gibt die Funktion den Wert 2 zurück. Selbstverständlich wäre es nun nicht sinnvoll, dieses fehlerhafte Ergebnis auch für weitere Berechnungen zu verwenden. Daher ist es möglich, vorzugeben, dass diese Funktion ausschließlich int-Werte annehmen soll:
function fun (int $zahl)
{
return $zahl * $zahl + 2;
}
Das führt dazu, dass sich die Funktion bei der Verwendung ganzer Zahlen korrekt ausführen lässt. Geben Sie jedoch eine Zeichenkette ein, führt das zu einer Fehlermeldung. Das entspricht bislang dem gewünschten Verhalten. Probleme können jedoch auftreten, wenn Sie nun eine Fließkommazahl übergeben. In diesem Fall wird der Wert automatisch in einen int-Wert umgewandelt. Das bedeutet, dass alle Nachkommastellen einfach abgeschnitten werden. Das führt dazu, dass das Ergebnis nicht mehr korrekt dargestellt wird.
Um dieses Problem zu beheben, führt PHP 8 Union Types ein. Das bedeutet, dass Sie mehrere Datentypen angeben können, die die Funktion oder die Methode verarbeiten sollen. Das macht es möglich, unerwünschte Daten auszuschließen. Dennoch sind Sie dabei nicht auf einen einzigen Datentyp beschränkt. Um Union Types zu erzeugen, ist es lediglich notwendig, die verschiedenen Typen durch einen senkrechten Strich voneinander zu trennen. Das obige Beispiel lässt sich dadurch beispielsweise wie folgt erweitern:
function fun (int|float $zahl)
{
return $zahl * $zahl + 2;
}
Hierbei können Sie nicht nur primitive Datentypen verwenden. Besonders hilfreich sind Union Types bei der Arbeit mit Objekten. Damit können Sie genau vorgeben, Objekte welcher Klassen die Funktion oder die Methode akzeptieren soll.
Darüber hinaus können Sie Union Types nicht nur für die Übergabewerte, sondern auch für die Rückgabewerte verwenden. Dabei müssen Sie jedoch beachten, dass sich der Typ void nicht mit anderen Datentypen verbinden lässt. Das bedeutet, dass es nach wie vor nicht möglich ist, eine Funktion oder eine Methode zu erstellen, bei der nur in manchen Fällen ein Rückgabewert auftritt, in anderen Fällen hingegen nicht.
Neuer validierter Return Type: static
Eine weitere wichtige Neuerung besteht darin, dass der Schlüsselbegriff static mit der Version PHP 8 zu einem validierten Return Type wird. Das kann wichtig sein, wenn Sie mit vererbten Methoden arbeiten.
Als Beispiel hierfür können Sie die folgende Klasse verwenden:
class Elternklasse
{
public function methode()
{
return = clone $this;
}
}
Nun können Sie eine Kindklasse davon ableiten. Da diese Klasse für das Beispiel keinen Inhalt benötigt, bleibt sie leer, obwohl dies bei einer realen Anwendung sicherlich unsinnig wäre:
class Kindklasse extends Elternklasse {}
Durch das Prinzip der Vererbung erhält die Kindklasse jedoch die Methode, die in der Elternklasse definiert ist. Das macht es möglich, ein Objekt der Kindklasse zu erzeugen und die Methode darauf anzuwenden:
$meinObjekt = new Kindklasse();
$Rueckgabewert = $meinObjekt->methode();
Der Wert, den die Methode zurückgibt und der in der Variable $Rueckgabewert aufgenommen wird, ist in diesem Fall ein Objekt der Kindklasse. Um klare Strukturen vorzugeben, ist es bei der Erzeugung der Methode jedoch sinnvoll, den Typ des Rückgabewerts anzugeben.
Nun tritt jedoch das Problem auf, dass der Typ hierbei nicht eindeutig ist. Es ist möglich, mehrere Klassen von der Elternklasse abzuleiten. Die Methode soll sich auf jede von ihnen anwenden lassen. Bei der Bestimmung des Rückgabewerts müssen Sie daher nur angeben, dass dieses Objekt genau den gleichen Typ aufweist wie das Objekt, auf das die Methode angewendet wird. Diese Vorgabe ist jedoch bislang nicht möglich.
PHP 8 führt hierfür nun den Begriff static als Rückgabewert ein. Dieser gibt an, dass das entsprechende Objekt von der gleichen Klasse abgeleitet sein muss wie das Objekt, auf das die Methode effektiv angewendet wird – im angegebenen Beispiel also der Kindklasse. Es darf sich dabei nicht um ein Objekt der Elternklasse handeln. Wenn Sie PHP 8 verwenden, können Sie diesen Begriff auf folgende Weise in die Klassendefinition einfügen:
class Elternklasse
{
public function methode(): static
{
return = clone $this;
}
}
Weak Maps für eine Reduzierung des Ressourcenbedarfs
Eine weitere Neuerung bei PHP 8 stellt die Einführung von Weak Maps dar. Diese beeinflusst das Verhalten des Garbage Collectors. Weak Maps kommen jedoch fast ausschließlich bei sehr komplexen Anwendungen zum Einsatz. Für einfachere PHP-Programme sind diese meistens nicht von Bedeutung. Dennoch sollen die wesentlichen Grundzüge hier kurz dargestellt werden.
PHP verfügt über einen Garbage Collector. Diese Funktion bewirkt, dass Objekte, die im Programm nicht mehr zum Einsatz kommen, gelöscht werden. Das führt zu einer einfacheren Programmgestaltung, da der Programmierer diese Aufgabe nicht selbst erledigen muss. Dennoch wird dadurch verhindert, dass das Programm unnötigen Speicherplatz beansprucht.
Bei manchen Anwendungen ist es sinnvoll, ein Cache zu erstellen, um die Performance bei der Ausführung zu verbessern. Darin wird eine Referenz zu dem entsprechenden Objekt gespeichert. Bei den bisherigen PHP-Versionen tritt nun jedoch das Problem auf, dass der Garbage Collector ein Objekt nur dann löschen kann, wenn es keinen Verweis mehr auf dieses gibt. Bei der Verwendung eines Caches bleibt die Referenz jedoch häufig bestehen, obwohl das Objekt nicht mehr verwendet wird. Das verhindert die Löschung.
Die Einführung von Weak Maps ermöglicht es nun, Verweise zu verwenden, die den Garbage Collector nicht davon abhalten, das entsprechende Objekt zu löschen. Das führt zu einer deutlich effizienteren Nutzung des Arbeitsspeichers und damit zu einer besseren Performance.
Vereinheitlichung der Syntax bei Ausgabe der Klassennamen
Seit PHP 5.5 ist es möglich, den Namen einer Klasse als String auszugeben, indem man den Begriff ::class an den Namen der Klasse anhängt. Dieses Verhalten erscheint in vielen Fällen jedoch etwas unlogisch: Wenn man den Klassennamen bereits kennt, ist es nicht erforderlich, ihn mit diesem Ausdruck erneut zu ermitteln.
Aus diesem Grund gehen viele Programmierer beim ersten Kontakt mit dieser Funktionalität davon aus, dass diese dazu dient, den Klassennamen eines Objekts zu ermitteln, beispielsweise auf die folgende Weise: $meinObjekt::class.
Das war bislang jedoch nicht möglich. Der Ausdruck ::class ließ sich lediglich auf Klassennamen anwenden. Die Verwendung ist nur dann sinnvoll, wenn Sie mit Namensräumen arbeiten. In diesem Fall führt dieser Begriff dazu, dass neben der Klasse auch der zugehörige Namensraum angezeigt wird.
Da diese Funktionsweise jedoch bisher für einige Verwirrung sorgte, nimmt PHP 8 hierbei nun eine Anpassung vor. Fortan ist es möglich, mit diesem Begriff den Klassennamen eines Objekts anzuzeigen – so wie im oben dargestellten Beispiel.
Einfache Konvertierung zwischen verschiedenen Datums- und Zeitangaben
Eine weitere kleine Neuerung betrifft die Konvertierungsmöglichkeiten zwischen Datums- und Zeitangaben. PHP unterstützt hierbei viele unterschiedliche Typen. Die Neuerung ist jedoch nur für Datumsangaben der Typen DateTime und DateTimeImmutable gültig. Diese sind genau gleich aufgebaut. Zwischen ihnen besteht lediglich der Unterschied, dass der erste Typ veränderbar ist und der zweite Typ nicht.
Bislang war es nicht möglich, eine Datumsangabe des Typs DateTime in den Typ DateTimeImmutable zu konvertieren. Auch die umgekehrte Abwandlung war nicht erlaubt. PHP 8 gibt Ihnen fortan jedoch diese Möglichkeiten.
Änderungen bei Arrays mit negativem Index
PHP ist eine der wenigen Programmiersprachen, die es erlaubt, Arrays mit einem negativen Index zu erstellen. Sie können beim Erzeugen eines Arrays stets den Wert für den Startpunkt festlegen. Hierbei sind auch negative Werte erlaubt.
Allerdings kam es hierbei bislang zu einer unterbrochenen Indexierung. Das erste Feld erhielt zwar einen negativen Index. Beim zweiten Feld wurde dann jedoch der Wert 0 verwendet. Wenn Sie beispielsweise ein Array mit 4 Feldern erstellen und dabei den Startindex -6 vorgeben, erhalten Sie ein Array mit den Feldern -6, 0, 1 und 2.
PHP 8 ändert dieses Verhalten nun. Fortan kommt es auch bei der Verwendung eines negativen Werts für den Startindex zu einer kontinuierlichen Nummerierung. Wenn Sie wieder -6 als Startwert angeben, nehmen die weiteren Felder die Positionen -5, -4 und -3 ein.
Constructor Property Promotion
Die Constructor Property Promotion stellt eine Anpassung der Syntax dar, die die Programmerstellung erleichtern und beschleunigen soll. Diese Neuerung ist dann nützlich, wenn Sie eine Klasse mit sogenannten Promoted Parameters verwenden – wenn Sie den Attributen also Sichtbarkeitsmerkmale wie public, private oder protected zuweisen.
Der bisherigen Syntax entsprechend müssen Sie diese Merkmale an mehreren Stellen angeben. Das stellt einen erheblichen Aufwand dar. Außerdem ist es unnötig, da es nach der einmaligen Nennung ohnehin nicht mehr möglich ist, andere Werte vorzugeben.
Daher ist es fortan nur noch notwendig, diese Angaben ein einziges Mal im Konstruktor durchzuführen – nach dem folgenden Muster:
class Beispiel
{
public function __construct(
public int $attribut1 = 0,
public int $attribut2 = 0,
public int $attribut3 = 0,
) {}
}
Neue Funktion str_contains()
PHP 8 führt die neue Funktion str_contains() ein. Diese ermöglicht es, herauszufinden, ob eine bestimmte Zeichenfolge in einer anderen Zeichenkette enthalten ist. Sie gibt eine boolesche Variable zurück.
Bisher kam in PHP zu diesem Zweck die Funktion strpos() zum Einsatz. Diese gibt die Position des ersten Auftretens der Zeichenfolge an, wenn diese in der entsprechenden Zeichenkette enthalten ist. Kommt sie nicht darin vor, gibt sie den Wert false zurück.
Theoretisch lässt sich daher damit genau die gleiche Funktionsweise wie bei der Verwendung der neuen Funktion str_contains erzielen. Allerdings kam es hierbei häufig zu Problemen. Die Ursache dafür besteht darin, dass der Wert 0 in PHP dem booleschen Wert für false entspricht. Wenn sich die gesuchte Zeichenfolge ganz am Anfang befindet, wird die Position 0 zurückgegeben. Das kann je nach gewählter Darstellung zu einer Verwechslung mit dem Wert false führen. Daher haben die PHP-Entwickler beschlossen, eine neue Funktion für diese Aufgabe bereitzustellen.
3. Major Update: PHP 8 ist nicht abwärtskompatibel
Die Aktualisierung auf PHP 8 stellt ein Major Update dar. Das bedeutet nicht nur, dass diese Neuerung umfangreiche Änderungen mit sich bringt. Darüber hinaus folgt daraus, dass hierbei keine Abwärtskompatibilität besteht.
Bei den meisten Updates einer Programmiersprache achten die Entwickler darauf, eine Abwärtskompatibilität sicherzustellen. Das bedeutet, dass sich auch ältere Programme, die einer früheren Version entsprechen, mit dem aktuellen Interpreter ausführen lassen. Die neue Version stellt dann lediglich eine Erweiterung dar, die die bisherigen Regeln jedoch nicht verändert.
Allerdings ist es auch hin und wieder angebracht, ein größeres Update durchzuführen. Dieses soll nicht nur die Möglichkeiten der Programmiersprache erweitern, sondern auch Fehler und Probleme der bisherigen Versionen beheben. Das führt jedoch dazu, dass sich dabei Code, dessen Ausführung mit den bisherigen Interpretern möglich war, nun eventuell nicht mehr ausführen lässt.
Bei PHP 8 handelt es sich wie gesagt um ein Major Update. Daher kann es zu Fehlern bei Ausführen älterer Programme mit dem neuen Interpreter kommen. Ein Beispiel hierfür wurde in diesem Artikel bereits erwähnt. Wenn Sie in einem Programm beim Überschreiben einer Methode den Datentyp geändert haben, kam es bisher nur zu einer Warnmeldung. Das Programm ließ sich jedoch ausführen. Wenn Sie nun versuchen, den entsprechenden Code auf einen PHP 8-Interpreter auszuführen, ist dies jedoch nicht möglich.
Das heißt jedoch nicht, dass es grundsätzlich unmöglich ist, ein bereits bestehendes Programm mit dem neuen PHP 8-Interpreter auszuführen. Nur wenn dieses einen Befehl verwendet, den die neue Version nicht mehr unterstützt, kommt es zu einer Fehlermeldung und zu einem Abbruch des Programms.
Die nachfolgende Liste gibt einen kleinen Überblick über die wichtigsten Befehle und Funktionen, die bislang erlaubt waren, die bei der Verwendung von PHP 8 jedoch nicht mehr zulässig sind:
- Der Ausdruck match wurde zu einem reservierten Schlüsselbegriff.
- Der Konstruktor einer Klasse muss zwingend den Namen __contruct() erhalten. Eine Methode, die den gleichen Namen wie die Klasse trägt, wird nicht mehr als Konstruktor interpretiert.
- Nicht als statisch ausgezeichnete Methoden dürfen nicht mehr in einem statischen Kontext aufgerufen werden.
- Bei Konstanten ist es nicht mehr möglich, bei den Bezeichnern Unterschiede zwischen Groß- und Kleinschreibung zu berücksichtigen. Das dritte Argument der define()-Funktion darf demnach nicht mehr true sein.
- Die Verwendung der Funktion create_function() ist nicht mehr zulässig.
- Die Funktion each() darf nicht mehr verwendet werden.
- Die Verwendung der Funktion array_key_exists() für Objekte ist nicht mehr zulässig.
- Die Verwendung des Begriffs parent in einer Klasse, die keine Eltern-Klasse hat, führt fortan zu einem Fehler.
4. Was müssen Webseitenbetreiber beachten?
Die bisherigen Abschnitte in diesem Artikel haben die Änderungen, die PHP 8 mit sich bringt, ausführlich beschrieben. Wenn Sie selbst Programme mit PHP erstellen, sind diese Informationen sehr hilfreich, um Ihre Erzeugnisse an diese Änderungen anzupassen.
Allerdings gibt es auch viele Webseitenbetreiber, die selbst über keine Programmierkenntnisse verfügen und denen es daher schwerfällt, die Auswirkungen dieser Überarbeitung einzuordnen. Diese betrachten das Erscheinen neuer PHP Versionen häufig mit Sorge und wissen nicht, wie sie darauf reagieren sollen. Daher stellt der letzte Abschnitt dieses Artikels kurz vor, welche Auswirkungen das Erscheinen von PHP 8 auf Ihre Website haben wird.
Kann ich nach dem Release sofort auf PHP 8 umsteigen?
Welche Maßnahmen Sie ergreifen können oder sollen, hängt zunächst von Ihrem Hosting-Anbieter ab. Dieser ist für die Einrichtung der Server-Infrastruktur zuständig. Erst, wenn der Anbieter PHP 8 auf seinem Server freigibt, können Sie die neue Technik nutzen.
Die neue Version wird zwar am 26. November 2020 veröffentlicht. Das heißt jedoch nicht, dass alle Anbieter diese unverzüglich zur Verfügung stellen. Wenn Sie auf die Angebote bei Domaintechnik® zugreifen, werden Sie jedoch zu den ersten Anwendern gehören, die PHP 8 nutzen können. Durch das selbst entwickelte Control Panel ist es möglich, die neue Technik besonders schnell umzusetzen.
Muss ich zwingend auf PHP 8 umsteigen?
Selbst wenn PHP 8 bereits verfügbar ist, bedeutet das noch nicht, dass Sie aktiv werden müssen. Der Umstieg erfolgt freiwillig. Wenn Sie nichts ändern möchten, ist keinerlei Anpassung notwendig. Auf diese Weise nutzen Sie auch weiterhin Ihre bisherige PHP-Version, sodass Ihre Programme korrekt ausgeführt werden. Solange der Support hierfür noch nicht ausgelaufen ist, stellt dies kein Problem dar.
Der aktive Support für die aktuelle PHP-Version 7.4 endet beispielsweise im November 2021. Danach erscheinen noch für ein weiteres Jahr Sicherheits-Updates. Während dieser Zeitspanne ist die Nutzung weiterhin möglich. Erst danach ist es geboten, auf eine neuere Version umzusteigen.
Allerdings ist es empfehlenswert, den Wechsel so früh wie möglich in Angriff zu nehmen. Auf diese Weise profitieren Sie von der verbesserten Performance des PHP-Interpreters. Das führt zu schnelleren Ladezeiten. Davon profitieren nicht nur Ihre Besucher. Darüber hinaus kann sich dies positiv auf die Position Ihrer Seite in den Suchergebnissen auswirken.
Wie kann ich meine PHP-Version ändern?
Wenn Sie sich zu diesem Schritt entscheiden, können Sie die verwendete PHP-Version ganz einfach in Ihrem Control Panel umstellen. Allerdings ist es zuvor wichtig, Ihre Website einer intensiven Überprüfung zu unterziehen. Wie bereits gesagt, ist PHP 8 nicht abwärtskompatibel. Das bedeutet, dass eventuell Fehler auftreten, wenn Sie Ihr System ohne Anpassungen auf PHP 8 umstellen.
Wenn Sie ein vorgefertigtes CMS-System wie WordPress verwenden, sollten Sie zuvor die Systemvoraussetzungen beim Hersteller prüfen. Nachdem Sie alle Updates und ein Backup vorgenommen haben, müssen Sie hier lediglich Ihre Version aktualisieren. Diese sollte dann bereits an PHP 8 angepasst sein.
Anleitung: WordPress PHP-Version aktualisieren
Verwenden Sie hingegen eine individuell erstellte Software, ist es empfehlenswert, diese durch einen Experten prüfen zu lassen. Auf diese Weise stellen Sie sicher, dass Sie von den Vorteilen der neuen Technik profitieren, ohne dass es dabei zu Fehlern kommt.