Auf seinem Blog führt PHP-Entwickler Brent Roose eine fortlaufende Liste der geplanten und beschlossenen Neuerungen für das nächste Major Release von PHP. Die neue Version ist momentan „under very active development“, der erste Alpha-Release ist bereits raus. Bis zum Final-Release Ende des Jahres werden sich also wohl noch einige weitere Änderungen ergeben. Den Blogpost will Roose bis dahin regelmäßig aktualisieren.
JIT-Compiler
Unter den bereits beschlossenen Neuerungen ist ein Just-in-Time-Compiler, der für deutlich mehr Performanz sorgen soll – wenn auch wohl eher weniger im Kontext von Web Requests. Dahinter steckt Folgendes:
PHP ist, anders als Rust, C oder Java, eine interpretierte Sprache. Der Code wird nicht kompiliert, sondern während der Laufzeit Zeile für Zeile interpretiert, das heißt, für die CPU in Maschinencode übersetzt. Der JIT-Compiler soll Teile eures PHP-Codes künftig während der Laufzeit kompilieren. Vorstellen könnt ihr euch das wie eine gecachte Version des interpretierten Codes, die während der Laufzeit erstellt wird. Wie das funktioniert? Der JIT-Compiler verfügt über eine Funktion, die den Code während der Laufzeit überwacht. Teile davon, die mit hoher Frequenz wiederholt ausgeführt werden, können dann zu optimiertem Maschinencode kompiliert und anstelle des eigentlichen Codes on the fly verwendet werden. Für einen Deep Dive in die Thematik sei euch dieser Crashkurs von Mozilla ans Herz gelegt.
Named Arguments
Zuletzt für den kommenden Release von PHP 8 bestätigt wurden sogenannte Named Arguments. Die Neuerung wurde erst kürzlich in einem separaten Blogpost zum Release bekannt gegeben. Das Feature wird auch Named Parameters genannt und seine Aufnahme in den kommenden Major Release wurde im Vorfeld kontrovers diskutiert. Named Arguments machen euren Code flexibler und ermöglichen es, saubereren Code zu schreiben – ein Vorteil, der Sorgen um Abwärtskompatibilität und aufgeblasene APIs laut Blogpost-Verfasser Brent-Roose schlussendlich überwiege.
Named Arguments erlauben euch zukünftig, Eingabedaten anhand des Parameternamens an eine Funktion zu übergeben.
setcookie(
name: 'test',
expires: time() + 60 * 60 * 2,
);
Vorher war das nur über die Parameterabfolge möglich. Auch sogenanntes Array-Spreading wird von dem neuen Feature unterstützt:
$data = new CustomerData(...$customerRequest->validated());
Weitere wissenswerte Details dazu könnt ihr im zugehörigen Blogpost nachlesen.
Union Types
Union Types sind eine Zusammenfassung – oder Union – zweier oder mehrerer Typen, über die angezeigt wird, dass alle in der Union genannten Typen verwendet werden können, zum Beispiel so:
public function foo(Foo|Bar $input): int|float;
static
wird zum validen Return Type
static
ist ein spezieller Klassenname in PHP, der die Klasse referenziert, auf die eine Methode aufgerufen wird, auch wenn die Methode vererbt ist. In PHP 8 wird static
neben self
und parent
zum validen Return Type. PHP ist dynamisch typisiert. Es ist anzunehmen, dass sich sowohl für Unions als auch für static
-Return-Types eine ganze Reihe von Use-Cases finden.
Weak Maps
In PHP 7.4 wurden schwache Referenzen, sogenannte weakrefs hinzugefügt. Darüber können Referenzen zu Objekten hergestellt werden, die den Garbage Collector nicht davon abhalten, diese Objekte zu zerstören. WeakMaps
sind quasi die Fortführung dieser Funktionalität.
Von Nutzen ist das zum Beispiel im Fall von ORM, wo aus Performanzgründen oft Caches implementiert werden, die Entitätsklassen referenzieren. Solange ein Cache ein solches Objekt referenziert, konnte es vor Version 7.4 nicht vom Garbage Collector aus dem Speicher gelöscht werden – auch dann nicht, wenn es ausschließlich vom Cache referenziert wurde. Über schwache Referenzen und Weak Maps lässt sich festlegen, dass solche Objekte gelöscht werden, sobald nur noch der Cache sie referenziert. Im Fall von ORM, wo oft sehr viele Entitäten in einem Request gemanagt werden, bieten Weak Maps eine ressourcenschonende Art des Umgangs mit diesen Objekten.
Syntax-Tweaks
Mit der Uniform Variable Syntax RFC wurden einige Inkonsistenzen in PHPs Variablensyntax ausgebügelt. Für PHP 8 sind weitere Anpassungen angedacht für Fälle, die dabei übersehen wurden.
Seit PHP 5.5 erlaubt die ::class
-Synax das Fetchen von Klassennamen als Strings. Die syntaktische Ähnlichkeit führte wohl vorher verbreitet zu der Annahme, dass auch $object::class
funktioniert. Um den Namen der Klasse eines Objektes zu fetchen, braucht es allerdings bislang folgende Syntax: get_class($object)
. In V8 soll derartiger Code
$foo = new Foo();
var_dump($foo::class);
künftig dasselbe bewirken.
Sonstige Neuerungen
In Version 8 wird es euch möglich sein, DateTime
– und DateTimeImmutable
-Objekte jeweils ineinander zu konvertierten. Außerdem neu: Die fdiv
-Funktion, die das Teilen durch 0 ermöglicht. Anstelle einer Fehlermeldung bekommt ihr in V8 fallabhängig INF
, -INF
, oder NAN
zurück. Auf Wunsch und dank der Mitarbeit der PHP-Community werden in PHP 8 korrekte Typenannotationen für interne Funktionen und Methoden hinzugefügt. Und: Auch für interne Funktionen werden in Version 8 zukünftig Type Errors anstelle von null
und einer Warnung ausgegeben. Zudem werden eine ganze Reihe weiterer Warnungen zu konkreten Fehlermeldungen konvertiert. Alle sonstigen Neuerungen und was im Detail dahinter steckt, könnt ihr entweder in Rooses Blogpost oder in den einzelnen RFC nachlesen.
Achtung: Bei Version 8 handelt es sich um ein Major Release. Das impliziert nicht abwärtskompatible Änderungen. Wer allerdings kontinuierlich auf die aktuellste Version aktualisiert hat, dürfte damit eher weniger Probleme haben – die meisten davon wurden wohl schon in vorherigen Versionen überholt.
Passend dazu:
- PHP 7.4: Die neue Version der Web-Programmiersprache ist kein Routine-Update
- PHP-Framework Laravel: Das ist neu in Version 6