
(Volodymyr Burdiak/Shutterstock)
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.
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.
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 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
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.
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.
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.
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
Bitte beachte unsere Community-Richtlinien
Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.
Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.
Dein t3n-Team