Die Unterstützung für benannte Parameter wurde hinzugefügt.
Die Unterstützung für Attribute wurde hinzugefügt.
Die Unterstützung für die Beförderung von Konstruktoreigenschaften (Deklaration von Eigenschaften in der Konstruktorsignatur) wurde hinzugefügt.
Die Unterstützung für zusammengefasste Typen wurde hinzugefügt.
Die Unterstützung für den
Ausdruck match
wurde hinzugefügt.
Die Unterstützung für den
nullsafe-Operator
(?->
) wurde hinzugefügt.
Die Klasse WeakMap wurde hinzugefügt.
Die Klasse ValueError wurde hinzugefügt.
Eine beliebige Anzahl von Funktionsparametern kann nun durch einen variadischen Parameter ersetzt werden, solange die Typen kompatibel sind. Zum Beispiel ist der folgende Code nun erlaubt:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
static (wie in "late static binding", späte statische Bindung) kann nun als Rückgabetyp verwendet werden:
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
Es ist nun möglich, den Klassennamen eines Objekts mit Hilfe von
$object::class
zu ermitteln. Das Ergebnis ist dasselbe wie
bei get_class($object)
.
new
und instanceof
können nun durch Verwendung von
new (Ausdruck)(...$args)
und
$obj instanceof (Ausdruck)
mit beliebigen Ausdrücken
verwendet werden.
Es wurden einige Verbesserungen an der Einheitlichkeit der
Variablensyntax vorgenommen, zum Beispiel ist Folgendes nun erlaubt:
Foo::BAR::$baz
.
Die Schnittstelle Stringable wurde hinzugefügt. Sie wird automatisch implementiert, wenn eine Klasse eine __toString()-Methode definiert.
Traits können nun abstrakte private Methoden definieren. Diese Methoden müssen von der Klasse implementiert werden, die den Trait verwendet.
throw
kann nun als Ausdruck verwendet werden. Das
ermöglicht Verwendungen wie:
<?php
$fn = fn() => throw new Exception('Exception in der Pfeilfunktion');
$user = $session->user ?? throw new Exception('Muss einen Benutzer haben');
In Parameterlisten ist nun ein optionales Komma am Ende erlaubt.
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- Dieses Komma ist nun erlaubt.
) {
}
Es ist nun möglich, catch (Exception)
zu schreiben, um eine
Ausnahme abzufangen, ohne sie in einer Variablen zu speichern.
Die Unterstützung für den Typ mixed wurde hinzugefügt.
Private Methoden, die in einer übergeordneten Klasse deklariert wurden, erzwingen für die Methoden einer Kindklasse keine Vererbungsregeln mehr (mit Ausnahme von finalen privaten Konstruktoren). Das folgende Beispiel veranschaulicht, welche Einschränkungen aufgehoben wurden:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Löst eine Warnung aus, da "final" keine Bedeutung mehr hat:
private final function method4() {}
}
class ChildClass extends ParentClass {
// Alles Folgende ist nun erlaubt, auch wenn die Modifikatoren nicht
// dieselben sind wie bei den privaten Methoden in der Elternklasse.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
Die Funktion get_resource_id() wurde hinzugefügt. Sie
gibt denselben Wert zurück wie (int) $resource
und bietet
dieselbe Funktionalität mit einer übersichtlicheren API.
Die Klasse InternalIterator wurde hinzugefügt.
Die Methoden DateTime::createFromInterface() und DateTimeImmutable::createFromInterface() wurden hinzugefügt.
Für DateTime wurde die Formatangabe p
hinzugefügt, die
ähnlich ist wie P
, aber für UTC Z
anstelle von +00:00
zurückgibt.
Die Schnittstellen DOMParentNode und DOMChildNode mit neuen Traversal- und Kontroll-APIs wurden hinzugefügt.
FILTER_VALIDATE_BOOL
wurde als Alias für
FILTER_VALIDATE_BOOLEAN
hinzugefügt. Der neue Name
sollte bevorzugt werden, weil er den kanonischen Typnamen verwendet.
Die Funktionen enchant_dict_add(),
enchant_dict_is_added() und die Konstante
LIBENCHANT_VERSION
wurden hinzugefügt.
Die neue Option pm.status_listen
wurde hinzugefügt. Sie
ermöglicht es, den Status von einem anderen Endpunkt zu erhalten (z. B. Port
oder UDS-Datei). Dies ist nützlich, um den Status zu erhalten, wenn alle
Kindprozesse mit der Bearbeitung lang laufender Anfragen beschäftigt sind.
HashContext-Objekte können nun serialisiert werden.
Die Konstanten IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
und
IntlDateFormatter::RELATIVE_SHORT
wurden hinzugefügt.
Die Funktion ldap_count_references() wurde hinzugefügt; sie gibt die Anzahl der Referenzmeldungen in einem Suchergebnis zurück.
Wenn die ini-Einstellung opcache.record_warnings aktiviert ist, zeichnet OPcache die Warnungen auf, die bei der Kompilierung auftreten, und gibt sie beim nächsten Include wieder, auch wenn sie aus dem Cache geliefert werden.
Die Unterstützung für die Cryptographic Message Syntax (CMS)
(» RFC 5652), die aus Funktionen zum
Verschlüsseln, Entschlüsseln, Signieren, Überprüfen und Lesen besteht,
wurde hinzugefügt. Die API ist der API für
PKCS-#7-Funktionen ähnlich und enthält darüber hinaus
folgende neue Verschlüsselungskonstanten:
OPENSSL_ENCODING_DER
,
OPENSSL_ENCODING_SMIME
und
OPENSSL_ENCODING_PEM
:
Die Funktion preg_last_error_msg() wurde hinzugefügt. Sie gibt eine menschenlesbare Meldung für den letzten PCRE-Fehler zurück und ergänzt die Funktion preg_last_error(), die einen Integer-Enum-Wert zurückgibt.
Die folgenden Methoden können nun Informationen über die Standardwerte der Parameter interner Funktionen zurückgeben:
Die Methode SQLite3::setAuthorizer() und entsprechende Klassenkonstanten wurden hinzugefügt. Damit ist es möglich, eine benutzerdefinierte Callback-Funktion anzugeben, die verwendet wird, um eine Aktion in der Datenbank zu autorisieren oder nicht.
Die Funktionen str_contains(),
str_starts_with() und
str_ends_with() wurden hinzugefügt. Sie prüfen, ob
haystack
needle
enthält
bzw. damit beginnt oder endet.
Die Funktion fdiv() wurde hinzugefügt. Sie führt eine
Gleitkomma-Division nach IEEE 754-Semantik durch. Die Division durch Null
wird als wohldefiniert betrachtet und gibt einen der Werte
Inf
, -Inf
oder
NaN
zurück.
Die Funktion get_debug_type() wurde hinzugefügt. Sie gibt einen Typ zurück, der für Fehlermeldungen nützlich ist. Anders als gettype() verwendet sie kanonische Typnamen, gibt die Klassennamen von Objekten zurück und nennt bei Ressourcen den Ressourcentyp.
Die Funktionen printf() und Freunde unterstützen nun
die Formatangaben %h
und %H
. Diese
sind vergleichbar mit %g
und %G
,
verwenden aber immer "."
als Dezimaltrennzeichen,
anstatt es durch die LC_NUMERIC
-Locale zu bestimmen.
Die Funktionen printf() und Freunde unterstützen nun
die Verwendung von "*"
als Breite oder Genauigkeit. In
diesem Fall wird die Breite/Genauigkeit als Parameter an printf
übergeben. Außerdem ermöglicht dies bei %g
,
%G
, %h
und %H
die Verwendung der Genauigkeit -1
. Zum Beispiel kann
der folgende Code verwendet werden, um die standardmäßige
Gleitkomma-Formatierung von PHP zu reproduzieren:
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
Die Funktion proc_open() unterstützt nun
Pseudo-Terminal (PTY)-Deskriptoren. Das folgende hängt
stdin
, stdout
und
stderr
an dasselbe PTY an:
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() unterstützt nun Socket-Paar-Deskriptoren.
Das folgende fügt ein bestimmtes Socket-Paar an stdin
,
stdout
und stderr
an:
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
Im Gegensatz zu Pipes gibt es bei Sockets unter Windows keine Probleme mit blockierenden I/Os. Allerdings funktionieren nicht alle Programme korrekt mit stdio-Sockets.
Die Sortierfunktionen verwenden nun eine stabile Sortierung. Das bedeutet, dass Elemente, die verglichen und für gleich befunden werden, ihre ursprüngliche Reihenfolge beibehalten.
Die Funktionen array_diff(), array_intersect() und ihre Variationen können nun mit einem einzigen Array als Parameter verwendet werden. Das bedeutet, dass Verwendungen wie die folgende nun möglich sind:
<?php
// OK, auch wenn $excludes leer ist:
array_diff($array, ...$excludes);
// OK, auch wenn $arrays nur ein einziges Array enthält:
array_intersect(...$arrays);
?>
Der Parameter flag
der Funktion
ob_implicit_flush() akzeptiert nun ein
bool anstelle eines int.
Die Klasse PhpToken fügt dem Tokenizer eine objektbasierte Schnittstelle hinzu. Diese Klasse bietet eine einheitlichere und ergonomischere Darstellung ist zudem speichereffizienter und schneller.
Die Erweiterung Zip wurde auf die Version 1.19.1 aktualisiert.
Neue Methoden ZipArchive::setMtimeName() und ZipArchive::setMtimeIndex(), um die Änderungszeit eines Eintrags festzulegen.
Neue Methode ZipArchive::registerProgressCallback(), um Aktualisierungen beim Schließen eines Archivs bereitzustellen.
Neue Methode ZipArchive::registerCancelCallback(), um einen Abbruch während des Schließens eines Archivs zu ermöglichen.
Neue Methode ZipArchive::replaceFile(), um den Inhalt eines Eintrags zu ersetzen
Neue Methode ZipArchive::isCompressionMethodSupported(), um auf optionale Komprimierungsfunktionen zu prüfen.
Neue Methode ZipArchive::isEncryptionMethodSupported(), um auf optionale Verschlüsselungsfunktionen zu prüfen.
Die Eigenschaft ZipArchive::lastId wurde hinzugefügt, um den Indexwert des zuletzt eingefügten Eintrags zu erhalten.
Mit den Eigenschaften ZipArchive::status und ZipArchive::statusSys oder der Methode ZipArchive::getStatusString() können nun Fehler nach dem Schließen eines Archivs überprüft werden.
Die Option 'remove_path'
der Methoden
ZipArchive::addGlob() und
ZipArchive::addPattern() wird nun als beliebiges
Zeichenketten-Präfix behandelt (um mit der Option
'add_path'
konsistent zu sein), während sie früher als
Verzeichnisname behandelt wurde.
Optionale Komprimierungs- und Verschlüsselungsfunktionen werden nun in phpinfo aufgelistet.