## Changements non rétrocompatibles

### PHP Core

#### Les noms d'alias `"array"` et `"callable"`

Il n'est plus possible d'utiliser `"array"` et `"callable"` comme noms d'alias de classe dans class_alias()

#### Comparaison approximative d'objets non comparables

Comparer approximativement des objets non comparables (par exemple des enums, CurlHandle et d'autres classes internes) à des booléens était auparavant incohérent. Si comparé à un littéral booléen `$object == true`, il se comportait de la même manière que `(bool)$object`. Si comparé à une valeur statiquement inconnue `$object == $true`, il retournait toujours `false`. Ce comportement a été consolidé pour toujours suivre le comportement de `(bool)$object`.

#### Valeur de retour de gc_collect_cycles

La valeur de retour de gc_collect_cycles() n'inclut plus les chaînes et ressources qui ont été collectées indirectement via des cycles.

#### Substituer le mot-clé static dans une sous-classe finale

Il est désormais permis de substituer static par self ou le nom concret de la classe dans les sous-classes finales.

#### Gestionnaires de tick

Les gestionnaires de tick sont désormais désactivés après l'exécution de toutes les fonctions de fermeture, la destruction des objets et le nettoyage des gestionnaires de sortie.

#### Liaison des traits

Les traits sont désormais liés avant la classe parente. Il s'agit d'un changement comportemental subtil, mais qui devrait mieux correspondre aux attentes des utilisateurs.

#### Erreurs lors de la compilation et du chaînage des classes

Les erreurs émises lors de la compilation et du chaînage des classes sont désormais toujours différées et traitées après la compilation ou le chaînage des classes. Les erreurs fatales émises lors de la compilation ou du chaînage des classes provoquent le traitement immédiat de toutes les erreurs différées, sans appeler les gestionnaires d'erreurs définis par l'utilisateur.

#### Exceptions levées par les gestionnaires d'erreurs définis par l'utilisateur

Les exceptions levées par les gestionnaires d'erreurs définis par l'utilisateur lors du traitement des erreurs de chaînage des classes ne sont plus promues en erreurs fatales et n'empêchent plus le chaînage.

#### Erreur d'application d'attribut lors de la compilation

Appliquer `#[\Attribute]` à une classe abstraite, un enum, une interface ou un trait déclenche une erreur lors de la compilation. Auparavant, l'attribut pouvait être ajouté, mais lorsque ReflectionAttribute::newInstance() était appelé, une erreur était levée. L'erreur peut être différée de la compilation à l'exécution en utilisant le nouvel attribut `#[\DelayedTargetValidation]`.

#### Le paramètre INI disable_classes

Le paramètre INI disable_classes a été supprimé car il provoque la rupture de diverses hypothèses du moteur.

#### Destructuration de valeurs non-tableaux

Destructurer des valeurs non-tableaux (autres que `null`) en utilisant `[]` ou list() émet désormais un avertissement.

#### Avertissements liés au cast

Un avertissement est désormais émis lors du cast de flottants (ou de chaînes ressemblant à des flottants) en entiers s'ils ne peuvent pas être représentés comme tels. Cela affecte les casts explicites en int et les casts implicites en int.

Un avertissement est désormais émis lors du cast de NAN vers d'autres types.

### Bzip2

bzcompress() lève désormais une ValueError lorsque `block_size` n'est pas compris entre 1 et 9.

bzcompress() lève désormais une ValueError lorsque `work_factor` n'est pas compris entre 0 et 250.

### DOM

Cloner un DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection, et Dom\DtdNamedNodeMap échoue désormais. Cela n'a jamais réellement abouti à un objet fonctionnel, donc aucun impact n'est attendu.

### FileInfo

finfo_file() et finfo::file() lèvent désormais une ValueError à la place de TypeError lorsque `filename` contient des octets nuls. Cela aligne le type d'erreur levée pour être cohérent avec le reste du langage.

### Intl

L'extension nécessite désormais au moins ICU 57.1.

IntlDateFormatter::setTimeZone()/datefmt_set_timezone() lèvent désormais une IntlException en cas de classes non initialisées ou d'échecs de clonage.

Toutes les méthodes Locale lèvent désormais une ValueError lorsque l'argument locale contient des octets nuls.

Le comportement de `Collator::SORT_REGULAR` en ce qui concerne la gestion des chaînes numériques est désormais aligné sur le comportement de `SORT_REGULAR` dans ext/standard.

### LDAP

ldap_get_option() et ldap_set_option() lèvent désormais une ValueError lorsqu'une option invalide est passée.

### MBString

Les tables de données Unicode ont été mises à jour vers Unicode 17.0

### MySQLi

L'appel au constructeur mysqli sur un objet déjà construit n'est désormais plus possible et génère une Error.

### ODBC

ODBC suppose désormais qu'au moins la fonctionnalité ODBC 3.5 est disponible. La définition ODBCVER et les indicateurs du système de construction pour la contrôler ont été supprimés.

ODBC ne dispose plus d'indicateurs de construction pour construire avec des pilotes spécifiques (sauf pour DB2) et supprime les cas spéciaux pour ces pilotes. Il est fortement recommandé d'utiliser un gestionnaire de pilotes comme iODBC ou unixODBC sur les systèmes non Windows.

### Opcache

L'extension Opcache est désormais toujours intégrée dans le binaire PHP et toujours chargée. Les directives INI opcache.enable et opcache.enable_cli sont toujours prises en compte.

Les options de configuration --enable-opcache/--disable-opcache ont été supprimées, et la compilation ne produit plus les fichiers opcache.so ou php_opcache.dll.

L'utilisation des directives INI `zend_extension=opcache.so` ou `zend_extension=php_opcache.dll` émettra un avertissement.

### PCNTL

pcntl_exec() lève désormais une ValueError lorsque les entrées du paramètre `args` contiennent des octets nuls.

pcntl_exec() lève désormais une ValueError lorsque les entrées ou les clés du paramètre `env_vars` contiennent des octets nuls.

### PCRE

L'extension est compilée sans l'option semi-dépréciée PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.

### PDO

Les arguments du constructeur définis en conjonction avec `PDO::FETCH_CLASS` suivent désormais la sémantique habituelle de CUFA (call_user_func_array()). Cela signifie que les clés de chaîne agiront comme des arguments nommés. De plus, l'encapsulation automatique pour les arguments par valeur passés à un paramètre par référence a été supprimée, et l'habituel `E_WARNING` à ce sujet est désormais émis. Pour passer une variable par référence à un argument de constructeur, utiliser l'affectation de référence de valeur de tableau générale : `$ctor_args = [&$valByRef]`

Essayer d'appeler PDOStatement::setFetchMode() pendant un appel à PDOStatement::fetch(), PDOStatement::fetchObject(), PDOStatement::fetchAll(), par exemple en utilisant des astuces telles que passer l'objet statement comme argument de constructeur lors de la récupération dans un objet, lèvera désormais une Error.

La valeur des constantes `PDO::FETCH_GROUP`, `PDO::FETCH_UNIQUE`, `PDO::FETCH_CLASSTYPE`, `PDO::FETCH_PROPS_LATE`, et `PDO::FETCH_SERIALIZE` a changé.

Une ValueError est désormais levée si `PDO::FETCH_PROPS_LATE` est utilisé avec un mode de récupération différent de `PDO::FETCH_CLASS`, cohérent avec les autres indicateurs de récupération.

Une ValueError est désormais levée si `PDO::FETCH_INTO` est utilisé comme mode de récupération dans PDO::fetchAll(), similaire à `PDO::FETCH_LAZY`.

### PDO_FIREBIRD

Une ValueError est désormais levée lorsqu'on essaie de définir un nom de curseur trop long sur un PDOStatement résultant du pilote Firebird.

### PDO_SQLITE

SQLite PDO::quote() lève désormais une exception ou émet un avertissement, en fonction du mode d'erreur, si la chaîne contient un octet nul.

PDO::sqliteCreateCollation() lève désormais une exception si le callback a un type de retour incorrect, ce qui le rend plus conforme au comportement de Pdo\Sqlite::createCollation().

### POSIX

posix_kill() lève désormais une ValueError lorsque l'argument process_id est inférieur ou supérieur à ce que la plateforme supporte (entier signé ou plage longue), posix_setpgid() lève désormais une ValueError lorsque process_id ou process_group_id est inférieur à zéro ou supérieur à ce que la plateforme supporte.

posix_setrlimit() lève désormais une ValueError lorsque les arguments hard_limit ou soft_limit sont inférieurs à -1 ou si soft_limit est supérieur à hard_limit.

### Reflection

ReflectionAttribute::newInstance() peut désormais lever des erreurs pour les attributs internes si l'attribut a été appliqué sur une cible invalide et que l'erreur a été différée du temps de compilation au temps d'exécution via l'attribut #[\DelayedTargetValidation].

### Session

Tenter d'écrire des données de session lorsque $_SESSION a une clé contenant le caractère pipe (`|`) émettra désormais un avertissement au lieu d'échouer silencieusement.

session_start() est désormais plus stricte concernant l'argument options. Elle lève désormais une ValueError si le tableau n'est pas une table de hachage, ou une TypeError si la valeur read_and_close n'est pas d'un type valide compatible avec int.

Passer un entier `0` comme argument `locales` à setlocale() n'est plus supporté et lève désormais une TypeError.

### SimpleXML

Passer une expression XPath qui retourne autre chose qu'un ensemble de nœuds à SimpleXMLElement::xpath() émettra désormais un avertissement et retournera `false`, au lieu d'échouer silencieusement et de retourner un tableau vide.

### SNMP

snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() et SNMP::__construct() lèvent désormais une ValueError lorsque le nom d'hôte est trop grand, contient un octet nul ou si le port est donné lorsqu'il est négatif ou supérieur à 65535, les valeurs de délai d'attente et de tentatives sont inférieures à -1 ou trop grandes.

### SOAP

SoapClient::__doRequest() accepte désormais un nouveau paramètre optionnel `uriParserClass` acceptant des arguments de type string ou `null`. `null` représente la méthode originale basée sur (parse_url()), tandis que les nouveaux backends seront utilisés lorsqu'on passe soit Uri\Rfc3986\Uri ou Uri\WhatWg\Url.

### Sockets

socket_create_listen(), socket_bind() et socket_sendto() lèvent désormais une ValueError si le port est inférieur à 0 ou supérieur à 65535, et également si l'une des entrées du tableau hints est indexée numériquement.

socket_addrinfo_lookup() lève désormais une TypeError si l'une des valeurs de hints ne peut pas être convertie en int et peut lever une ValueError si l'une de ces valeurs dépasse la capacité.

socket_set_option() avec les options `MCAST_LEAVE_GROUP`/`MCAST_LEAVE_SOURCE_GROUP` lève désormais une exception si la valeur n'est pas un objet ou un tableau valide.

socket_set_option() avec le contexte multicast lève désormais une ValueError lorsque le socket créé n'est pas de la famille `AF_INET`/`AF_INET6`.

### SPL

ArrayObject n'accepte plus les enums, car la modification des propriétés $name ou $value peut casser les hypothèses du moteur.

Le paramètre `length` de la fonction SplFileObject::fwrite() est désormais nullable. La valeur par défaut est passée de `0` à `null`.

### Standard

L'utilisation d'une fonction de la famille printf avec un formateur qui ne spécifiait pas la précision réinitialisait incorrectement la précision au lieu de la traiter comme une précision de 0.

### Tidy

tidy::__construct(), tidy::parseFile(), tidy::parseString() lèvent désormais une ValueError si la configuration contient une valeur invalide ou tente de définir une entrée interne en lecture seule, et une TypeError si une clé de configuration n'est pas une chaîne.

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