Nach einem Jahr der Entwicklung wurde die Programmiersprache PHP 8.1 veröffentlicht. Der neue Branch umfasst eine Reihe neuer Funktionen sowie einige Änderungen, die die Kompatibilität beeinträchtigen.
Wesentliche Verbesserungen in PHP 8.1:
- Die Unterstützung für Enumerationen wurde hinzugefügt. Jetzt können Sie folgende Konstrukte verwenden: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
- Die Unterstützung für leichte Threads, genannt Fibers, wurde hinzugefügt, die eine niedrige Steuerung von Ausführungsströmen ermöglichen. Die Unterstützung für Fibers wird in den Frameworks Amphp und ReactPHP integriert. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('nach der Aussetzung'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('nach der Wiederaufnahme');
- Die Implementierung des Opcode-Caches (opcache) wurde verbessert, um die Möglichkeit zu bieten, Informationen über die Vererbung von Klassen zu cachen. Diese Optimierung hat die Leistung einiger Anwendungen um 5-8 % erhöht. Zu den weiteren Optimierungen gehören die Verbesserung der JIT-Leistung, die Implementierung von JIT-Unterstützung für die ARM64-Architektur (AArch64), die Beschleunigung der Namensauflösung sowie die Optimierung der Bibliotheken timelib und ext/date. Außerdem wurden die Leistung von Serialisierung und Deserialisierung, sowie die Optimierung der Funktionen get_declared_classes(), explode(), strtr(), strnatcmp() und dechex() gesteigert. Insgesamt wurde eine Leistungssteigerung von 23,0 % für Symfony Demo und 3,5 % für WordPress festgestellt.
- Der Entpackungsoperator innerhalb von Arrays „…$var“, der es ermöglicht, bestehende Arrays bei der Definition eines neuen Arrays einzusetzen, wurde um die Unterstützung von String-Schlüsseln erweitert (vorher wurden nur numerische Identifikatoren unterstützt). Zum Beispiel kann im Code jetzt verwendet werden: $array1 = ["a" => 1]; $array2 = ["b" => 2]; $array = ["a" => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
- Es ist erlaubt, das Schlüsselwort „new“ in Initialisierern zu verwenden, beispielsweise in Funktionsdefinitionen als Standardparameter oder in Attributen von Argumenten. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
- Es wurde die Möglichkeit geschaffen, Klassenattribute als schreibgeschützt zu kennzeichnen (Wert in solche Attribute kann nur einmal festgelegt werden, danach ist eine Änderung nicht mehr möglich). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post(‘Titel’, /* … */); $post->title = ‘Andere’; > Fehler: Kann schreibgeschütztes Attribut Post::$title nicht ändern
- Eine neue Syntax für aufrufbare Objekte (callable) wurde implementiert – ein Closure kann nun gebildet werden, indem eine Funktion aufgerufen und ihr der Wert „…“ übergeben wird (d.h. myFunc(…) anstelle von Closure::fromCallable(‘myFunc’)): function foo(int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
- Die vollständige Unterstützung für Schnittmengentypen (intersection types) wurde hinzugefügt, um neue Typen zu schaffen, indem vorhandene kombiniert werden. Im Gegensatz zu Union-Typen, die Sammlungen aus zwei oder mehr Typen definieren, erfordern Schnittmengentypen, dass alle angegebenen Typen im befüllten Set vorhanden sind. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
- Ein neuer Typ "never" wurde eingeführt, der genutzt werden kann, um statische Analysatoren darüber zu informieren, dass eine Funktion die Ausführung des Programms beendet, beispielsweise durch das Auslösen einer Ausnahme oder das Ausführen der Funktion exit. function dd(mixed $input): never { exit; }
- Eine neue Funktion array_is_list wurde vorgeschlagen, die es ermöglicht festzustellen, ob die Schlüssel in einem Array in aufsteigender Reihenfolge numerischer Werte beginnen bei 0 angeordnet sind: $list = [„a“, „b“, „c“]; array_is_list($list); // true $notAList = [1 => „a“, 2 => „b“, 3 => „c“]; array_is_list($notAList); // false $alsoNotAList = [„a“ => „a“, „b“ => „b“, „c“ => „c“]; array_is_list($alsoNotAList); // false
- Um die Überschreibung von Konstanten der Elternklasse zu verbieten, kann jetzt das Schlüsselwort «final» verwendet werden. class Foo { final public const X = «foo»; } class Bar extends Foo { public const X = «bar»; > Fatal error: Bar::X kann die finale Konstante Foo::X nicht überschreiben }
- Die Funktionen fsync und fdatasync wurden vorgeschlagen, um Änderungen aus dem Festplattencache zwangsweise zu speichern. $file = fopen(«sample.txt», «w»); fwrite($file, «Some content»); if (fsync($file)) { echo «Die Datei wurde erfolgreich auf der Festplatte gespeichert.»; } fclose($file);
- Die Verwendung der Präfixe «0o» und «0O» für oktale Zahlen wurde neben dem zuvor verwendeten Präfix «0» hinzugefügt. 016 === 0o16; // true 016 === 0O16; // true
- Es wurde vorgeschlagen, die Verwendung von $GLOBALS selektiv einzuschränken, was zu einem Verlust der Abwärtskompatibilität führen wird, jedoch die Operationen mit Arrays erheblich beschleunigen könnte. Beispielweise wird geprüft, ob das Schreiben in $GLOBALS und das Übergeben von $GLOBALS per Referenz verboten werden kann. Eine Analyse von 2000 Paketen zeigt, dass nur 23 von ihnen von dieser Änderung betroffen sind. Sofern der Vorschlag genehmigt wird, wird in 8.1 die Unterstützung solcher Ausdrücke eingestellt: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
- Interne Methoden müssen jetzt den korrekten Typ zurückgeben. In PHP 8.1 werden Warnungen ausgegeben, wenn ein nicht übereinstimmender Typ zurückgegeben wird, aber in PHP 9.0 wird die Warnung durch einen Fehler ersetzt.
- Die Arbeit an der Übersetzung von Funktionen von der Verwendung von Ressourcen zur Manipulation von Objekten wurde fortgesetzt. Die Funktionen finfo_* und imap_* wurden auf Objekte übertragen.
- Es wurde erklärt, dass die Übertragung von null-Werten als Argumente an interne Funktionen, die als non-nullable gekennzeichnet sind, veraltet ist. In PHP 8.1 führt die Verwendung von Konstruktionen wie str_contains("string", null) zu einer Warnung, in PHP 9 zu einem Fehler.
- Die Unterstützung für die Hash-Algorithmen MurmurHash3 und xxHash wurde hinzugefügt.
Quelle: opennet.ru
