## Autres changements

### Changement du noyau

#### Closures

Les noms de fermeture ont été ajustés pour inclure le nom de la fonction parente et la ligne de définition pour les rendre plus faciles à distinguer, par exemple dans les traces de pile.

#### Fibres

Les commutations de fibres pendant l'exécution du destructeur sont désormais autorisées. Cela était précédemment bloqué en raison de conflits avec la collecte des déchets.

Les destructeurs peuvent désormais être exécutés dans une fibre séparée :

Lorsque le ramasse-miettes est déclenché dans une fibre, les destructeurs appelés par le ramasse-miettes sont exécutés dans une fibre séparée : la gc_destructor_fiber. Si cette fibre est suspendue, une nouvelle est créée pour exécuter les destructeurs restants. Le gc_destructor_fiber précédent n'est plus référencé par le ramasse-miettes et peut être collecté s'il n'est plus référencé ailleurs. Les objets dont le destructeur est suspendu ne seront pas collectés tant que le destructeur ne retourne pas ou que la Fiber n'est pas collectée.

#### Gestionnaires de sortie

Les drapeaux d'état des gestionnaires de sortie passés au paramètre `flags` de ob_start() sont maintenant effacés.

output_add_rewrite_var() utilise désormais `url_rewriter.hosts` à la place de `session.trans_sid_hosts` pour la sélection des hôtes qui seront réécrits.

### Changements dans les modules SAPI

#### apache2handler

Le support pour l'EOL Apache 2.0 et 2.2 a été supprimé. La version minimale d'Apache requise est désormais 2.4.

#### CLI

Le serveur intégré recherche un fichier d'index de manière récursive en parcourant les répertoires parents si le fichier spécifié ne peut pas être localisé. Ce processus était précédemment ignoré si le chemin semblait faire référence à un fichier, c'est-à-dire si le dernier composant du chemin contenait un point. Dans ce cas, une erreur 404 était renvoyée. Le comportement a été modifié pour rechercher un fichier d'index dans tous les cas.

#### FPM

La vidange des en-têtes sans corps réussira désormais.

La page d'état dispose d'un nouveau champ pour afficher un pic de mémoire.

La configuration /dev/poll de `events.mechanism` pour Solaris/Illumos a été retirée.

### Fonctions changées

#### Core

trigger_error() et user_error() ont désormais un type de retour de true au lieu de bool.

#### DOM

DOMDocument::registerNodeClass() a désormais un type de retour de true au lieu de bool. Il pouvait retourner que `true` en pratique.

#### Hash

hash_update() a désormais un type de retour de true au lieu de bool. Il pouvait retourner que `true` en pratique.

#### Intl

`NumberFormatter::ROUND_TOWARD_ZERO` et `NumberFormatter::ROUND_AWAY_FROM_ZERO` ont été ajoutés en tant qu'alias pour `NumberFormatter::ROUND_DOWN` et `NumberFormatter::ROUND_UP` pour être cohérent avec les nouveaux modes `PHP_ROUND_*`.

ResourceBundle::get() a désormais un type de retour provisoire de `ResourceBundle|array|string|int|null`.

Les fonctions idn_to_ascii() et idn_to_utf8() lancent désormais toujours des exceptions ValueError si le nom de `domain` est vide ou trop long.

Les fonctions idn_to_ascii() et idn_to_utf8() lancent désormais toujours des exceptions ValueError si le paramètre `variant` n'est pas `INTL_IDNA_VARIANT_UTS46`.

#### LibXML

libxml_set_streams_context() lance désormais immédiatement une TypeError lorsqu'une ressource non contextuelle de flux est passée à la fonction, au lieu de lancer plus tard lorsque le contexte de flux est utilisé.

#### MBString

Le comportement de mb_strcut() est désormais plus cohérent sur les chaînes UTF-8 et UTF-16 invalides. Il n'y a pas de changement de comportement pour les chaînes UTF-8 et UTF-16 valides.

#### ODBC

Le `row` de odbc_fetch_object(), odbc_fetch_array(), de odbc_fetch_into() a désormais une valeur par défaut de `null`, restant cohérent avec odbc_fetch_row(). Auparavant, les valeurs par défaut étaient `-1`, `-1`, et `0`, respectivement.

#### OpenSSL

L'`extra_attributes` dans openssl_csr_new() définit les attributs du CSR au lieu du DN du sujet, ce qui était incorrectement fait précédemment.

Le `dn` dans openssl_csr_new() permet de définir un array de valeurs pour une seule entrée.

Un nouveau `serial_hex` a été ajouté à openssl_csr_sign() pour permettre de définir des numéros de série au format hexadécimal.

Analyser un ASN.1 UTCTime avec openssl_x509_parse() échoue si les secondes sont omises pour les versions d'OpenSSL inférieures à 3.2 (`-1` est retourné pour de tels champs). Les versions d'OpenSSL supérieures à 3.3 ne chargeaient déjà pas de tels certificats.

#### PDO

Il est désormais possible de récupérer la valeur de l'attribut `PDO::ATTR_STRINGIFY_FETCHES` avec PDO::getAttribute().

Une nouvelle constante `PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE` a été ajoutée pour récupérer l'utilisation de la mémoire des résultats de requête avec PDO::getAttribute() pour les pilotes qui le prennent en charge.

#### PDO_FIREBIRD

Il est désormais possible de récupérer la valeur des attributs `FB_ATTR_DATE_FORMAT`, `FB_ATTR_TIME_FORMAT`, `FB_ATTR_TIMESTAMP_FORMAT`, avec PDO::getAttribute().

Ajout de nouveaux attributs pour spécifier le niveau d'isolation de transaction et le mode d'accès. Cinq constantes liées à cette fonctionnalité ont été ajoutées :

- `Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL`
- `Pdo\Firebird::READ_COMMITTED`
- `Pdo\Firebird::REPEATABLE_READ`
- `Pdo\Firebird::SERIALIZABLE`
- `Pdo\Firebird::WRITABLE_TRANSACTION`

Lors de l'utilisation de connexions persistantes, il y a maintenant une vérification de vivacité dans le constructeur.

Le contenu qui est construit change en fonction de la valeur de `FB_API_VER` dans ibase.h. Une nouvelle méthode statique Pdo\Firebird::getApiVersion() peut être utilisée pour obtenir cette information. Cette information est également maintenant référencée dans phpinfo().

Cinq nouveaux types de données sont désormais disponibles : `INT128`, `DEC16`, `DEC34`, `TIMESTAMP_TZ`, `TIME_TZ` . Ceux-ci sont disponibles à partir de Firebird 4.0.

#### PDO_MYSQL

Il est désormais possible de récupérer la valeur de l'attribut `PDO::ATTR_FETCH_TABLE_NAMES` avec PDO::getAttribute().

#### PDO_PGSQL

Support de la récupération de l'utilisation de la mémoire des requêtes pour `PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE`.

Si la colone est de type `FLOAT4OID` ou `FLOAT8OID` la valeur sera maintenant retournée en tant que float au lieu d'une string.

#### PGSQL

Le paramètre `conditions` de pg_select() est désormais facultatif et accepte un tableau vide.

#### Phar

Les méthodes Phar::setAlias(), Phar::setDefaultStub() peuvent désormais avoir un type de retour provisoire de true au lieu de bool.

#### POSIX

posix_isatty() définit désormais le numéro d'erreur lorsque l'argument de descripteur de fichier/flux est invalide.

#### Reflection

ReflectionGenerator::getFunction() peut maintenant être appelé après que le générateur ait fini d'exécuter.

#### Sockets

Le paramètre `backlog` de socket_create_listen() a désormais une valeur par défaut de `SOMAXCONN`. Auparavant, c'était `128`.

#### Sodium

Les fonctions sodium_crypto_aead_aes256gcm_()* sont désormais disponibles sur les processeurs aarch64 avec les extensions cryptographiques ARM.

#### SPL

Les méthodes SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() peuvent désormais avoir un type de retour provisoire de true à la place de bool.

SplObjectStorage implémente désormais SeekableIterator.

#### Standard

La valeur par défaut du `'cost'` pour l'algorithme de hachage `PASSWORD_BCRYPT` utilisé par la fonction password_hash() a été augmentée de `10` à `12`.

debug_zval_dump() indique désormais si un tableau est compacté.

long2ip() a désormais un type de retour de string à la place de `string|false`.

highlight_string() a désormais un type de retour de string|true à la place de `string|bool`.

print_r() a désormais un type de retour de string|true à la place de `string|bool`.

##### Arrondir avec round()

Le paramètre `mode` de la fonction round() a été étendu pour accepter `RoundingMode|int`, acceptant des instances d'un nouvel énumérateur RoundingMode.

Quatre nouveaux modes ont été ajoutés à la fonction round() : RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero

L'implementation interne de l'arrondi aux entiers a été réécrite pour être plus facile à vérifier pour la correction et plus facile à maintenir. Quelques bugs d'arrondi ont été corrigés à la suite de la réécriture. Par exemple, auparavant, l'arrondi de `0.49999999999999994` à l'entier le plus proche aurait donné `1.0` au lieu du résultat correct `0.0`. Des entrées supplémentaires pourraient également être affectées et donner des résultats différents par rapport aux versions PHP précédentes.

Correction d'un bug causé par l'arrondi "pré-arrondi" de la fonction round(). Auparavant, en utilisant "pré-arrondi" pour traiter une valeur comme `0.285` (en fait `0.28499999999999998`) comme un nombre décimal et l'arrondir à `0.29`. Cependant, "pré-arrondi" arrondit incorrectement certains nombres, donc cette correction supprime "pré-arrondi" et change la façon dont les nombres sont comparés, donc les valeurs sont correctement arrondies en tant que nombres décimaux.

Le nombre maximum de chiffres significatifs que round() peut gérer a été étendu d'un chiffre. Par exemple, `round(4503599627370495.5)` retournait `4503599627370495.5`, mais retourne maintenant `4503599627370496`.

### Autres changements aux extensions

#### cURL

Le minimum de la version de libcurl requise est désormais 7.61.0.

L'option `CURLOPT_DNS_USE_GLOBAL_CACHE` n'a plus aucun effet et est silencieusement ignorée. Cette fonctionnalité sous-jacente a été dépréciée dans libcurl 7.11.1, et supprimée dans libcurl 7.62.0.

#### GMP

Changer de type d'un objet GMP en bool est désormais possible au lieu de générer une `E_RECOVERABLE_ERROR`. Le comportement de conversion est surchargé de sorte qu'un objet GMP représentant la valeur `0` est converti en `false`.

#### LibXML

Le minimum de la version de libxml2 requise est désormais 2.9.4.

#### Intl

Le comportement de la classe Intl a été normalisé pour toujours lancer des exceptions Error lors de la tentative d'utilisation d'un objet non initialisé, ou lorsque le clonage échoue.

#### MBString

Les tables de données Unicode ont été mises à jour en Unicode 16.0.

#### MySQLnd

Le support pour le nouveau type de données VECTOR de MySQL 9 a été ajouté.

#### OpenSSL

Le minimum de la version d'OpenSSL requise est désormais 1.1.1.

#### PDO_PGSQL

Le minimum de la version de libpq requise est désormais 10.0.

#### PGSQL

Le minimum de la version de libpq requise est désormais 10.0.

#### SPL

Les accès hors limites dans SplFixedArray lancent désormais des exceptions de type OutOfBoundsException au lieu de RuntimeException. Car OutOfBoundsException est une classe enfant de RuntimeException, aucun changement de comportement n'est observé lors de la tentative de capture de ces exceptions.

#### XSL

Les propriétés typées XSLTProcessor::$cloneDocument et XSLTProcessor::$doXInclude sont désormais déclarées.

#### Zlib

Le minimum de la version de zlib requise est désormais 1.2.11.

### Performance

#### Core

Augmentation de la performance de l'analyse et de la génération de nombres à virgule flottante dans les constructions ZTS sous des charges très concurrentes. Cela affecte les fonctions printf() ainsi que les fonctions de sérialisation tel que json_encode() ou serialize().

sprintf() utilisant uniquement `%s` et l'interpolation de chaîne `%d` sera compilé en l'interpolation de chaîne équivalente, évitant les frais généraux d'un appel de fonction et l'analyse répétée de la chaîne de format.

#### BCMath

Augmentation de la performance des conversions de nombres et des opérations.

#### DOM

La performance de DOMNode::C14N() est grandement améliorée pour le cas sans requête xpath. Cela peut donner une amélioration de temps de facilement deux ordres de grandeur pour les documents avec des dizaines de milliers de nœuds.

Augmentation de la performance et réduction de la consommation de mémoire de la sérialisation XML.

Réduction de la consommation de mémoire des classes de nœuds.

#### FTP

Augmentation de la performance des téléversements FTP jusqu'à un facteur de 10x pour les téléversements volumineux.

#### Hash

Ajout des implémentations SSE2 et SHA-NI de SHA-256. Cela améliore les performances sur les processeurs pris en charge de ~1.3x (SSE2), et 3x - 5x (SHA-NI). Crédit à Colin Percival / Tarsnap pour cette optimisation.

#### MBString

mb_strcut() est désormais beaucoup plus rapide pour les chaînes UTF-8 et UTF-16.

La recherche des noms d'encodage mbstring est désormais beaucoup plus rapide.

La performance de la conversion de SJIS-win en Unicode est grandement améliorée.

#### MySQLnd

Augmentation de la performance de la cotation MySQLnd.

#### PCRE

Augmentation de la performance des groupes de capture nommés.

#### Random

Augmentation de la performance de Random\Randomizer, avec un accent spécifique sur les méthodes Random\Randomizer::getBytes(), et Random\Randomizer::getBytesFromString()().

#### SimpleXML

Augmentation de la performance et reduction de la consommation de mémoire de la sérialisation XML.

#### Standard

Les performances de strspn() et strcspn() sont grandement améliorées. Elles s'exécutent désormais en temps linéaire au lieu d'être bornées par un temps quadratique.

Augmentation de la performance de strpbrk().

get_browser() est désormais beaucoup plus rapide, jusqu'à 1.5x - 2.5x pour certains cas de test.