## Changement de rétrocompatibilité

### PHP Core

#### Programmes très proches de déborder la pile d'appels

Les programmes très proches de déborder la pile d'appels peuvent maintenant Error lorsqu'ils utilisent plus de zend.max_allowed_stack_size-zend.reserved_stack_size octets de pile (fiber.stack_size-zend.reserved_stack_size pour les fibres).

#### Executer proc_get_status() plusieurs fois

Exécuter proc_get_status() plusieurs fois retournera désormais toujours la bonne valeur sur les systèmes POSIX. Précédemment, seul le premier appel de la fonction retournait la bonne valeur. Exécuter proc_close() après proc_get_status() retournera également le bon code de sortie. Précédemment, cela retournait `-1`. En interne, cela fonctionne en mettant en cache le résultat sur les systèmes POSIX. Si le comportement précédent est requis, il est possible de vérifier la clé `"cached"` dans le tableau retourné par proc_get_status() pour vérifier si le résultat a été mis en cache.

#### Minuteries d'exécution maximales de Zend

Les minuteries d'exécution maximales de Zend sont maintenant activées par défault pour les versions ZTS sur Linux.

#### Utilisation des traits avec des propriétés statiques

L'utilisation des traits avec des propriétés statiques redéclarera désormais les propriétés statiques héritées de la classe parente. Cela créera un stockage de propriétés statiques séparé pour la classe actuelle. Cela est analogue à l'ajout de la propriété statique à la classe directement sans les traits.

#### Assigné un index négatif à un tableau vide

Assigner un index négatif $n à un tableau vide fera en sorte que le prochain index soit `$n+1` au lieu de `0`.

#### Vérification de la variance de la visibilité des constantes de classe

La variance de la visibilité des constantes de classe est maintenant correctement vérifiée lorsqu'elle est héritée des interfaces.

#### Entrées WeakMap dont la clé est mappée sur elle-même

Les entrées WeakMap dont la clé est mappée sur elle-même (éventuellement de manière transitive) peuvent maintenant être supprimées lors de la collecte des cycles si la clé n'est pas atteignable sauf en itérant sur le WeakMap (l'atteignabilité via l'itération est onsidérée comme faible). Auparavant, de telles entrées ne seraient jamais automatiquement supprimées.

### Date

L'extension DateTime a introduit des exceptions et erreurs spécifiques aux dates sous les hiérarchies DateError et DateException, au lieu de warnings et exceptions génériques. Cela améliore la gestion des erreurs, au détriment de devoir vérifier les erreurs et exceptions.

### DOM

Appeler DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith() sur un nœud qui n'a pas de parent est maintenant une opération nulle au lieu de lever une exception d'hiérarchie, ce qui est le comportement exigé par la spécification DOM.

Utiliser les méthodes DOMParentNode et DOMChildNode sans document fonctionne maintenant au lieu de lancer une DOMException `DOM_HIERARCHY_REQUEST_ERR`. Cela est conforme au comportement exigé par la spécification DOM.

Appeler DOMDocument::createAttributeNS() sans spécifier de préfixe créerait incorrectement un namespace par défaut, plaçant l'élément à l'intérieur du namespace au lieu de l'attribut. Ce bogue est maintenant corrigé.

DOMDocument::createAttributeNS() lancerait précédemment incorrectement une DOMException `DOM_NAMESPACE_ERRNAMESPACE_ERR` lorsque le préfixe était déjà utilisé pour un URI différent. Il choisit maintenant correctement un préfixe différent lorsqu'il y a un conflit de nom de préfixe.

De nouvelles méthodes et propriétés ont été ajoutées à certaines classes DOM. Si une classe utilisateur hérite de ces classes et déclare une méthode ou une propriété avec le même nom, les déclarations doivent être compatibles. Sinon, une erreur de compilation typique sur des déclarations incompatibles sera lancée. Voir la liste des nouvelles fonctionnalités et nouvelles fonctions pour une liste des méthodes et propriétés nouvellement implémentées.

### FFI

Les fonctions C qui ont un type de retour de void retournent maintenant `null` au lieu de retourner l'objet suivant `object(FFI\CData:void) { }`.

### Opcache

La directive INI opcache.consistency_checks a été supprimée. Cette fonctionnalité était cassée avec le tracing JIT, ainsi qu'avec le cache d'héritage, et a été désactivée sans moyen de l'activer depuis PHP 8.1.18 et PHP 8.2.5. Le tracing JIT et le cache d'héritage peuvent modifier la shm après que le script ait été persisté en invalidant sa somme de contrôle. La tentative de correction a sauté les pointeurs modifiables mais a été rejetée en raison de la complexité. Pour cette raison, il a été décidé de supprimer la fonctionnalité.

### Phar

Les types des constantes de la classe Phar sont maintenant déclarés.

### Standard

La fonction range() a subi divers changements :

- Une TypeError est maintenant lancé lors du passage d'objects, resources, ou arrays en tant qu'entrées de limites.
- Une ValueError plus descriptive est lancée lors du passage de `0` pour `$step`.
- Une ValueError est maintenant lancée lors de l'utilisation d'un `$step` négatif pour les plages croissantes.
- Si `$step` est un flottant qui peut être interprété comme un entier, c'est maintenant fait.
- Une ValueError est maintenant lancée si l'un des arguments est infini ou NAN.
- Un `E_WARNING` est émis si `$start` ou `$end` est une chaîne vide. La valeur continue d'être convertie en la valeur `0`.
- Un `E_WARNING` est maintenant émis si `$start` ou `$end` a plus d'un octet, seulement si c'est une chaîne non numérique.
- Un `E_WARNING` est maintenant émis si `$start` ou `$end` est converti en un entier car l'autre entrée de limite est un nombre. (par exemple : `range(5, 'z');`).
- Un `E_WARNING` est maintenant émis si `$step` est un flottant lors de la génération d'une plage de caractères, sauf si les deux entrées de limites sont des chaînes numériques (par exemple : `range('5', '9', 0.5);` ne produit pas de warning).
- range() produit maintenant une liste de caractères si l'une des entrées de limites est un chiffre en chaîne au lieu de convertir l'autre entrée en entier (par exemple : `range('9', 'A');`).

`<?php
range('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], à partir de PHP 8.3.0
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], avant PHP 8.3.0
?>`

number_format() gère maintenant les valeurs négatives de `$decimals` en arrondissant `$num` à `abs($decimals)` chiffres avant le séparateur décimal. Précédemment, les valeurs négatives de `$decimals` étaient ignorées.

Le drapeau d'erreur de file() vérifie maintenant toutes les drapeaux invalides. Notamment `FILE_APPEND` était précédemment accepté silencieusement.

### SNMP

Les types des constantes de la classe SNMP sont maintenant déclarés.