## Nouvelles Fonctionnalités

### PHP Core

#### Préfixe littéral octal entier

Les entiers octaux peuvent maintenant utiliser un préfixe explicite `0o`/`0O` dans les littéraux d'entiers, de manière similaire aux littéraux d'entiers binaires et hexadécimaux.

`<?php
014; // Littéral octal sans préfixe
0o14; // Littéral octal préfixé
?>`

#### La décompression de tableau avec des clés chaines de caractères

Ajout du support pour La décompression de tableau avec des clés chaines de caractères.

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

#### Argument nommé apres une décompression d'argument

Il est désormais possible de spécifier des arguments nommés après une décompression d'argument. par exemple : foo(...$args, named: $arg).

#### Clé de chemin complet pour les téléchargements de fichiers

Les téléchargements de fichiers fournissent désormais une clé `full_path` supplémentaire, qui contient le chemin complet (plutôt que juste le nom de base) du fichier téléchargé. Ceci est destiné à être utilisé en conjonction avec "upload webkitdirectory".

#### Enumerations

Le support pour les énumérations a été ajouté.

#### Fibers

Le support pour les fibres a été ajouté.

#### Syntaxe de callable de première classe

Les fermetures pour les callables peuvent maintenant être créées en utilisant la syntaxe `myFunc(...)`, qui est identique à `Closure::fromCallable('myFunc')`.

> Note: Le `...` fait partie de la syntaxe, et non une omission.

#### Intersection de types

Le support pour les intersection de types a été ajouté.

Attention

Les types d'intersection ne peuvent pas être utilisés avec les types d'union

#### Le type never

Un nouveau type de retour never a été ajouté. Cela indique qu'une fonction soit exit(), lance une exception, ou ne se termine pas.

#### `new` dans les initialiseurs

Il est désormais possible d'utiliser des expressions `new ClassName()` comme valeur par défaut d'un paramètre, d'une variable statique, d'initialisateurs de constantes globales, et comme arguments d'attribut. Les objets peuvent également être passés à define() maintenant.

#### Les propriétés en lecture seule

Le support pour la lecture seule a été ajouté.

#### Les constantes de classe finales

Ajout du support pour le modificateur final pour les constantes de classes. Aussi, les constantes d'interface deviennent surchargeables par défaut.

### CURL

Ajout de l'option `CURLOPT_DOH_URL`.

Ajout des options pour les certificats blob lorsque 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`

Ajout de CURLStringFile, qui peut être utilisé pour envoyer un fichier à partir d'une chaîne de caractères plutôt qu'un fichier:

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

### FPM

Ajout du format de statut openmetrics. Il peut être utilisé par Prometheus pour récupérer les métriques FPM.

Ajout d'une nouvelle option de pool pour le gestionnaire de processus dynamique appelée `pm.max_spawn_rate`. Elle permet de démarrer un nombre d'enfants à un rythme plus rapide lorsque le gestionnaire de processus dynamique est sélectionné. La valeur par défaut est `32` qui était la valeur précédente codée en dur.

### GD

Le support Avif est maintenant disponible via imagecreatefromavif() et imageavif(), si libgd a été compilé avec le support Avif.

### Hash

Les fonctions suivantes hash(), hash_file(), et hash_init() supportent maintenant un nouveau argument optionel `options`, qui peut être utilisé pour passer des données spécifiques à l'algorithme.

#### MurmurHash3

Ajout du support pour `MurmurHash3` avec support de streaming. Les variantes suivantes sont implémentées:

- murmur3a, 32-bit hash
- murmur3c, 128-bit hash for x86
- murmur3f, 128-bit hash for x64

L'état de hachage initial peut être passé via la clé `seed` dans le tableau `options`, par exemple:

`<?php
$h = hash("murmur3f", $data, options: ["seed" => 42]);
echo $h, "\n";
?>`
Un valeur de graine valide est dans la plage de `0` à la `UINT_MAX` définie par la plateforme, généralement `4294967295`.

#### xxHash

Ajout du support pour `xxHash`. Les variantes suivantes sont implémentées:

- xxh32, 32-bit hash
- xxh64, 64-bit hash
- xxh3, 64-bit hash
- xxh128, 128-bit hash

L'état de hachage initial peut être passé via la clé `seed` dans le tableau `options`, par exemple:

`<?php
$h = hash("xxh3", $data, options: ["seed" => 42]);
echo $h, "\n";
?>`
L'usage secret est supporté en passant la clé `secret` dans le tableau `options`, aussi :
`<?php
$h = hash("xxh3", $data, options: ["secret" => "at least 136 bytes long secret here"]);
echo $h, "\n";
?>`
La qualité du secret personnalisé est cruciale pour la qualité du hachage résultant. Il est fortement recommandé d'utiliser la meilleure entropie possible.

### MySQLi

#### Nouvelle directive INI`mysqli.local_infile_directory`

La directive INI mysqli.local_infile_directory a été ajoutée, qui peut être utilisée pour spécifier un répertoire à partir duquel les fichiers sont autorisés à être chargés. Elle n'a de sens que si mysqli.allow_local_infile n'est pas activé, car tous les répertoires sont autorisés dans ce cas.

#### Affecter des paramètres dans execute

Il est désormais possible d'affecter des paramètres en les passant comme un tableau à mysqli_stmt::execute(). Toutes les valeurs seront affectées en tant que chaînes de caractères. Seuls les tableaux de liste sont autorisés. Cette nouvelle fonctionnalité n'est pas disponible lorsque MySQLi est compilé avec libmysqlclient.

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

#### Nouvelle méthode mysqli_result::fetch_column()

mysqli_result::fetch_column() a été ajouté pour permettre de récupérer une seule valeur scalaire du jeu de résultats. La nouvelle méthode accepte un paramètre de colonne facultatif `column` basé sur 0 de type entier spécifiant quelle colonne récupérer.

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

### PDO

L'attribut `PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY` a été ajouté, qui peut être utilisé pour spécifier un répertoire à partir duquel les fichiers sont autorisés à être chargés. Elle n'a de sens que si `PDO::MYSQL_ATTR_LOCAL_INFILE` n'est pas activé, car tous les répertoires sont autorisés dans ce cas.

### PDO_SQLite

La syntaxe DSN `"file:"` de SQLite est maintenant supportée, ce qui permet de spécifier des drapeaux supplémentaires. Cette fonctionnalité n'est pas disponible si open_basedir est défini.

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

### POSIX

Ajout de `POSIX_RLIMIT_KQUEUES` et `POSIX_RLIMIT_NPTS`. Ces limites soft et hard ne sont disponibles que sur FreeBSD.

### Standard

fputcsv() accepte désormais un nouveau argument `eol` qui permet de définir une séquence de fin de ligne personnalisée, la valeur par défaut reste la même et est `"\n"`.

### SPL

SplFileObject::fputcsv() accepte désormais un nouveau argument `eol` qui permet de définir une séquence de fin de ligne personnalisée, la valeur par défaut reste la même et est `"\n"`.