© 300 librarians/Shutterstock.com, ieronim777/Shutterstock.com
Lohnt sich der Umstieg oder bleiben wir lieber bei 7.4?

PHP 8.1: Das sind die neuen Features


Letztes Jahr ist die neue Major-Version von PHP erschienen. Obwohl es viele großartige Features mit sich brachte, wurde es nicht besonders stark von der PHP-Community angenommen. Die Version 8.0 hat es nicht geschafft, die Entwickler komplett zu überzeugen – vielleicht schafft es ja die PHP-Version 8.1. Wir werfen einen Blick darauf.

Laut den Statistiken von Packagist [1] sind PHP 7.3, 7.2 und 7.4 die am meisten eingesetzten Versionen der Programmiersprache. Allerdings erhält die Version 7.2 keine Sicherheitsupdates mehr, 7.3 bekommt sie nur noch bis November dieses Jahres, und 7.4 wird (ebenfalls ab November) nur noch mit Sicherheitsupdates versorgt [2]. Das bedeutet, dass diejenigen, die noch die PHP-Versionen 7.2 und 7.3 im Einsatz haben, schnellstmöglich umsteigen sollten. Wir werden in diesem Artikel einen Blick auf die neuen Features der Version 8.1 werfen, die bereits als „Implemented“ in den RFCs angegeben wurden [3]. Allerdings ist es möglich, dass deren letztendliche Verwirklichungen noch kurz vor dem Release geändert werden.

Deprecated: Warnungen für Argumente mit null-Werten bei internen Funktionen

Aus historischen Gründen erlauben interne PHP-Funktionen null als Argument, obwohl der Typ des Arguments nicht nullable ist. Es gibt einige Polyfills, also Funktionen, die interne Funktionen in PHP nachbilden, um den Umstieg auf neue Versionen zu vereinfachen. Diese können aktuell einige interne Funktionen nicht korrekt abbilden [4]. Denn selbst geschriebene Funktionen dürfen nur dann bei skalaren Typen ein null als Parameter erhalten, wenn der Parameter auch als nullable angegeben wurde. Das gleiche Verhalten wird in PHP 8.1 auf interne Funktionen übertragen – allerdings zunächst mit einer Deprecate-Warnung. Für PHP-Versionen größer als 9.0 ist geplant, bei diesen Funktionen einen TypeError zu erzeugen. Wer also jetzt noch einfach null als Parameter an die internen Funktionen übergibt, könnte später Schwierigkeiten im Code haben.

Neue Funktion array_is_list()

In PHP können wir sehr einfach mit einem Array komplexe Strukturen abbilden. Wir können während der Laufzeit einfach neue Array-Keys hinzufügen und vorhandene verändern. Diese Flexibilität bringt natürlich Performanceprobleme mit sich. Ein PHP-Array lässt sich optimieren, wenn die Array-Keys durchnummeriert sind – von 0 bis zur Anzahl der Elemente. Diese Optimierung lässt sich aktuell schwer umsetzen, denn allein die Überprüfung der Keys ist schon sehr aufwendig. Der aktuelle Polyfill für die Funktion ist in Listing 1 abgebildet.

Listing 1

function array_is_list(array $array): bool { $expectedKey = 0; foreach ($array as $i => $_) { if ($i !== $expectedKey) { return false; } $expectedKey++; } return true; }

Mit der nativen Implementierung [5] der Funktion ließe sich der Code noch performanter umsetzen, da auf diese Weise nicht mehr davon ausgegangen werden muss, dass die Array-Keys einen nichtnumerischen Wert besitzen werden. Damit wird PHP in der Zukunft noch performanter werden. Eventuell könnte man sich auch Gedanken um einen neuen Datentyp list machen und ihn gesondert behandeln. Vielleicht könnte daraus sogar ein RFC werden.

$GLOBALS als Referenz verbieten

Globale Variablen existieren in PHP von Anfang an und bieten viel Flexibilität. Mit dieser Flexibilität entstehen aber auch oft Seiteneffekte. Mit dem RFC soll verboten werden, $GLOBALS-Variablen als Referenz einer anderen Variable zuzuweisen [6]. Um das RFC zu verstehen, muss man sich zunächst folgendes Beispiel ansehen:

$a = 1; $GLOBALS['a'] = 2; var_dump($a); // int(2)

Hier wird die Variable $a als Compiled-Variable intern abgespeichert, um schneller auf Variablen zugreifen zu können. Damit $a über Globals modifiziert werden kann, werden die Array-Keys von Globals so abgespeichert, dass die Keys einen Zeiger auf die Variablen haben. Das $GLOBALS-Array ist allerdings aus den normalen Arrayfunktionalitäten ausgenommen. So ist es zum Beispiel möglich, $GLOBALS einem Array zuzuweisen, damit dieses Array einen Zeiger auf $GLOBALS hat. Somit kann das neue Array vorhandene Variablen verändern, wie im folgenden...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang