## Neue Features

### PHP-Kern

#### Präfix für oktale Integer-Literale

Bei oktalen Integern ist es nun möglich, explizit `0o` oder `0O` als Präfix für numerische Literale anzugeben. Dies entspricht der Notation für binäre und hexadezimale Integer-Literale.

`<?php
014; // Oktales Literal ohne Präfix
0o14; // Oktales Literal mit Präfix
?>`

#### Entpacken von Arrays mit String-Schlüsseln

Die Unterstützung für das Entpacken von Arrays mit String-Schlüsseln wurde hinzugefügt.

`<?php
$arr1 = [1, 'a' => 'b'];
$arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd']
?>`

#### Benannter Parameter nach dem Entpacken von Parametern

Es ist nun möglich, benannte Parameter nach einem entpackten Parameter anzugeben. z. B. foo(...$args, named: $arg).

#### Vollständiger Pfad beim Hochladen von Dateien

Datei-Uploads bieten nun einen zusätzlichen `full_path`-Schlüssel, der den vollständigen Pfad (und nicht nur den Basisnamen) der hochgeladenen Datei enthält. Dies ist für die Verwendung in Verbindung mit dem HTML-Attribut "webkitdirectory" gedacht.

#### Aufzählungen

Die Unterstützung für Aufzählungen wurde hinzugefügt.

#### Fibers

Die Unterstützung für Fibers wurde hinzugefügt.

#### Callback-Funktionen als Objekte erster Klasse

Closures für Callback-Funktionen können nun mit der Syntax `myFunc(...)` erstellt werden, die identisch ist zu `Closure::fromCallable('myFunc')`.

> Hinweis: Das `...` ist keine Auslassung, sondern Teil der Syntax.

#### Schnittmengentypen (Intersection-Typen)

Die Unterstützung für Schnittmengentypen wurde hinzugefügt.

Achtung

Schnittmengentypen können nicht zusammen mit zusammengefassten Typen (Union-Typen) verwendet werden.

#### Never-Typ

Der neue Rückgabetyp never wurde hinzugefügt. Dieser zeigt an, dass eine Funktion entweder exit() aufruft, eine Exception auslöst, oder nicht beendet wird.

#### `new` in Initialisierungen

Es ist nun möglich, `new ClassName()`-Ausdrücke als Standardwert für die Initialisierung von Parametern, statischen Variablen und globalen Konstanten und als Eigenschafts-Parameter zu verwenden. Objekte können nun ebenfalls an define() übergeben werden.

#### Schreibgeschützte Eigenschaften

Die Unterstützung für readonly wurde hinzugefügt.

#### Finale Klassenkonstanten

Die Unterstützung für den Modifikator final für Klassenkonstanten wurde hinzugefügt. Außerdem werden Schnittstellenkonstanten standardmäßig überschreibbar.

### CURL

Die Option `CURLOPT_DOH_URL` wurde hinzugefügt.

Zusätzliche Optionen für Blob-Zertifikate, falls libcurl >= 7.71.0:

- `CURLOPT_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_ISSUERCERT`
- `CURLOPT_PROXY_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_SSLCERT_BLOB`
- `CURLOPT_PROXY_SSLKEY_BLOB`
- `CURLOPT_SSLCERT_BLOB`
- `CURLOPT_SSLKEY_BLOB`

Die Klasse CURLStringFile wurde hinzugefügt. Sie kann dazu verwendet werden, statt einer Datei eine Datei aus einem String zu senden:

`<?php
$datei = new CURLStringFile($daten, 'dateiname.txt', 'text/plain');
curl_setopt($curl, CURLOPT_POSTFIELDS, ['datei' => $datei]);
?>`

### FPM

Ein Openmetrics-Statusformat wurdet hinzugefügt. Es kann von Prometheus verwendet werden, um FPM-Metriken abzurufen.

Für den dynamischen Prozessmanager wurde eine neue Pool-Option namens `pm.max_spawn_rate` hinzugefügt. Sie ermöglicht ein schnelleres Starten einer Anzahl von Kindprozessen, wenn dynamisches PM ausgewählt ist. Der Standardwert ist `32`, was der vorherige fest kodierte Wert war.

### GD

Wenn libgd mit Avif-Unterstützung gebaut wurde, steht die Unterstützung von Avif nun über die Funktionen imagecreatefromavif() und imageavif() zur Verfügung.

### Hash

Die Funktionen hash(), hash_file() und hash_init() unterstützen nun zusätzlich den optionalen Parameter `options`, der zur Übergabe von Algorithmus-spezifischen Daten verwendet werden kann.

#### MurmurHash3

Die Unterstützung für `MurmurHash3` mit der Unterstützung für Streaming wurde hinzugefügt. Die folgenden Varianten sind implementiert:

- murmur3a, 32-Bit-Hash
- murmur3c, 128-Bit-Hash für x86
- murmur3f, 128-Bit-Hash für x64

Der anfängliche Hash-Status kann durch den Schlüssel `seed` im Array `options` übergeben werden, zum Beispiel:

`<?php
$h = hash("murmur3f", $data, options: ["seed" => 42]);
echo $h, "\n";
?>`
Ein gültiger Seed-Wert liegt im Bereich von `0` bis zum plattformdefinierten `UINT_MAX`, normalerweise `4294967295`.

#### xxHash

Die Unterstützung für `xxHash` wurde hinzugefügt. Die folgenden Varianten sind implementiert:

- xxh32, 32-Bit-Hash
- xxh64, 64-Bit-Hash
- xxh3, 64-Bit-Hash
- xxh128, 128-Bit-Hash

Der anfängliche Hash-Status kann durch den Schlüssel `seed` im Array `options` übergeben werden, zum Beispiel:

`<?php
$h = hash("xxh3", $data, options: ["seed" => 42]);
echo $h, "\n";
?>`
Die Verwendung eines geheimen Parameters wird durch Übergeben des Schlüssels `secret` im Array `options` ebenfalls unterstützt:
`<?php
$h = hash("xxh3", $data, options: ["secret" => "das Geheimnis muss hier mindestens 136 Bytes lang sein"]);
echo $h, "\n";
?>`
Die Qualität des benutzerdefinierten geheimen Parameters ist entscheidend für die Qualität des resultierenden Hashes. Es wird dringend empfohlen, für den geheimen Parameter die bestmögliche Entropie zu verwenden.

### MySQLi

#### Neue INI-Directive `mysqli.local_infile_directory`

Die INI-Direktive mysqli.local_infile_directory wurde hinzugefügt. Sie kann verwendet werden, um ein Verzeichnis anzugeben, aus dem aus dem Dateien geladen werden dürfen. Sie ist nur dann relevant, wenn mysqli.allow_local_infile nicht aktiviert ist, da in diesem Fall alle Verzeichnisse erlaubt sind.

#### Parameter in execute binden

Es ist nun möglich, Parameter zu binden, indem sie als Array an mysqli_stmt::execute() übergeben werden. Alle Werte werden als Zeichenketten gebunden. Nur Listen-Arrays sind erlaubt. Diese neue Funktion ist nicht verfügbar wenn MySQLi mit libmysqlclient kompiliert wurde.

`<?php
$stmt = $mysqli->prepare('INSERT INTO users(id, name) VALUES(?,?)');
$stmt->execute([1, $username]);
?>`

#### Neue Methode mysqli_result::fetch_column()

Die Methode mysqli_result::fetch_column() wurde hinzugefügt, um das Abrufen eines einzelnen skalaren Werts aus der Ergebnismenge zu ermöglichen. Die neue Methode akzeptiert den optionalen 0-basierten Parameter `column` vom Typ Integer, der angibt, aus welcher Spalte abgerufen werden soll.

`<?php
$result = $mysqli->query('SELECT username FROM users WHERE id = 123');
echo $result->fetch_column();
?>`

### PDO

Die Eigenschaft `PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY` wurde hinzugefügt. Damit kann ein Verzeichnis angegeben werden, aus dem Dateien geladen werden dürfen. Sie ist nur dann relevant, wenn `PDO::MYSQL_ATTR_LOCAL_INFILE` nicht aktiviert ist, da in diesem Fall alle Verzeichnisse erlaubt sind.

### PDO_SQLite

Die DSN-Syntax `"file:"` von SQLite wird nun unterstützt, was die Angabe zusätzlicher Flags ermöglicht. Dieses Feature ist nicht verfügbar, wenn open_basedir gesetzt ist.

`<?php
new PDO('sqlite:file:path/to/sqlite.db?mode=ro')
?>`

### POSIX

`POSIX_RLIMIT_KQUEUES` und `POSIX_RLIMIT_NPTS` wurden hinzugefügt. Diese rlimits sind nur unter FreeBSD verfügbar.

### Standard

Die Funktion fputcsv() akzeptiert nun den neuen Parameter `eol`, mit dem eine eigene Sequenz für das Zeilenende definiert werden kann. Die Vorgabe bleibt dieselbe wie bisher: `"\n"`.

### SPL

Die Methode SplFileObject::fputcsv() akzeptiert nun den neuen Parameter `eol`, mit dem eine eigene Sequenz für das Zeilenende definiert werden kann. Die Vorgabe bleibt dieselbe wie bisher: `"\n"`.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open