Nach einem Jahr Entwicklung wird die Version 8.4 der Programmiersprache PHP vorgestellt. Der neue Zweig umfasst eine Reihe von neuen Funktionen sowie einige inkompatible Änderungen.
Wesentliche Änderungen in PHP 8.4:
- Eine neue Implementierung des JIT-Compilers wurde auf Grundlage des IR Frameworks vorgeschlagen. Der entscheidende Unterschied besteht darin, dass der alte JIT direkt maschinenlesbare Anweisungen aus dem Bytecode generierte und verschiedene Backends für die Architekturen x86_64 und AArch64 verwendete, während der neue JIT ein einheitliches Backend für alle Architekturen nutzt und eine Zwischenrepräsentation (IR) generiert, die anschließend weiter optimiert und in maschinenlesbare Anweisungen für die jeweilige Zielplattform umgewandelt wird.
- Die Unterstützung für die Anheftung von Property Hooks wurde hinzugefügt, die es ermöglichen, zusätzliche Logik auszuführen, wenn auf Eigenschaften eines Objekts zugegriffen oder diese geändert werden, ohne Lese- und Schreiboperationen über die allgemeinen Funktionen __get und __set abzufangen und ohne zusätzliche Wrapper-Methoden zu erstellen. Der Einsatz von Property Hooks ermöglicht es, den Code erheblich zu reduzieren und das Überschreiben des Verhaltens bei der Arbeit mit Eigenschaften zu vereinfachen, indem ein eigener Handler an jede Eigenschaft gebunden wird. class User { public string $name { set { if (strlen($value) === 0) { throw new ValueError("Name must be non-empty"); } $this->name = $value; } } public function __construct(string $name) { $this->name = $name; } }
- Es ist nun erlaubt, Methodenreferenzen in der "new"-Konstruktion ohne trennende Klammern anzugeben, d.h. anstelle von "$name = (new MyClass())->method()" kann jetzt "$name = new MyClass()->method()" angegeben werden.
- Die Möglichkeit zur asymmetrischen Steuerung der Sichtbarkeit von Objekteigenschaften (public, private, protected) wurde hinzugefügt, getrennt für Schreiboperationen (set) und Leseoperationen (get). Zum Beispiel: class PhpVersion { public private(set) string $version = '8.4'; } $phpVersion = new PhpVersion(); var_dump($phpVersion->version); // string(3) '8.4' $phpVersion->version = 'PHP 8.3'; // Fehler
- Es wird standardmäßig Unterstützung für 'faule' (lazy) Objekte bereitgestellt, deren Initialisierung beim ersten Gebrauch erfolgt.
- Anstelle des allgemeinen Parameters 'opcache.jit_buffer_size' zur Steuerung des JIT-Compilers und zur Einstellung der JIT-Pufferspeichergröße wurden die Parameter 'opcache.jit' und 'opcache.jit_buffer_size' angeboten. Um JIT zu deaktivieren, kann jetzt 'opcache.jit=disable' anstelle von 'opcache.jit_buffer_size=0' angegeben werden. Änderungen wurden vorgenommen, um den Speicherverbrauch zu reduzieren und die JIT-Leistung in bestimmten Situationen zu verbessern.
- Das Attribut '#[\Deprecated]' wurde hinzugefügt, um veraltete Funktionen, Klassen und Methoden zu kennzeichnen. #[\Deprecated('verwenden Sie newFunction() stattdessen', since: '1.1')] function oldFunction() { // … }
- Die Klasse \Dom\HTMLDocument wurde implementiert, die eine korrekte Analyse der HTML5-Markup unterstützt.
- Die Funktion request_parse_body() wurde hinzugefügt, um HTTP-Anfragen mit dem Inhaltstyp multipart/form-data (RFC1867) zu analysieren.
- Die Funktionen array_find(), array_find_key(), array_any() und array_all() wurden hinzugefügt. Die Funktionen array_find() und array_find_key() geben das erste Element oder den Schlüssel im Array zurück, für das die durch die vom Benutzer angegebene Callback-Funktion durchgeführte Prüfung wahr ist. Die Funktionen array_any() und array_all() hingegen geben ein beliebiges übereinstimmendes Element bzw. alle übereinstimmenden Elemente zurück. Zum Beispiel kann der erste Titel, dessen Länge mehr als 5 Zeichen beträgt, mit folgendem Code ausgegeben werden: $firstMatch = array_find( $posts, function (Post $post) { return strlen($post->title) > 5; });
- Die Methoden DateTime::getMicrosecond() und DateTimeImmutable::setMicrosecond($microsecond) wurden hinzugefügt, um die Zeit mit Mikrosekundenpräzision zu erhalten und einzustellen, sowie die Methode DateTime::createFromTimestamp().
- In PDO (PHP Data Objects), dem abstrakten Interface zur Arbeit mit Datenbanken, wurde die Möglichkeit hinzugefügt, SQL-Parser und spezifische Subklassen für bestimmte Datenbanktreiber zu erstellen. Neue Subklassen Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc und Pdo\Sqlite wurden ebenfalls hinzugefügt.
- Neue Funktionen mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), mb_lcfirst(), bcceil(), bcdivmod(), bcfloor() und bcround(), pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), pcntl_waitid(), http_get_last_response_headers(), http_clear_last_response_headers() und fpow() wurden hinzugefügt.
- Die Funktionen exit und die können jetzt als vollständige Funktionen aufgerufen werden, die als Argumente an andere Funktionen übergeben werden dürfen. Zuvor waren die Möglichkeiten der Funktionen exit() und die() stark eingeschränkt, da sie einfache Umhüllungen der Schlüsselwörter exit und die darstellten.
- Änderungen wurden hinzugefügt, die die Ausnutzung von Schwachstellen durch Buffer-Overflows erschweren und die Randomisierung der Dateinamen, die durch die Funktion tempnam() erstellt werden, verstärken.
- Das Verhalten, bei dem für Funktionsparameter mit einem standardmäßig zugewiesenen Wert null automatisch die Zuweisung von Werten null erlaubt wurde, wurde als veraltet erklärt. Damit solche Parameter nun Werte null annehmen können, ist die explizite Angabe des Präfixes „?“ erforderlich. Beispielsweise sollte anstelle von „function save(Book $book = null) {}“ „function save(?Book $book = null) {}“ angegeben werden.
- Die veralteten Konstanten E_STRICT, MYSQLI_REFRESH_*, die Funktionen mysqli_ping(), mysqli_kill(), mysqli_refresh(), sowie die Methoden mysqli::ping(), mysqli::kill(), mysqli::refresh() wurden bekannt gegeben. Die Verwendung von „_“ als Klassennamen ist jetzt verboten, ebenso einige Eigenschaften von DOMDocument und DOMEntity. Die Überschreibung von Klass Konstanten für GMP ist nicht mehr zulässig, die nun das Schlüsselwort „final“ hat.
Zusätzlich wurde die Veröffentlichung des statischen Analysewerkzeugs PHPStan 2.0 angekündigt, das es ermöglicht, Fehler im PHP-Code zu finden, ohne dessen Ausführung oder die Nutzung von Unit-Tests. Der Analyzer bietet 10 Ebenen, die Bereiche wie die Erkennung unbestimmter Variablen, unbekannter Klassen, Funktionen und Methoden abdecken; Überprüfung der Typen von Argumenten und Rückgabewerten; Korrektheit der Verwendung bestimmter Typen; sowie die Feststellung von nie aufgerufenem Code. Der Projektcode ist in PHP geschrieben und wird unter der MIT-Lizenz vertrieben.
Quelle: opennet.ru
