"array" et "callable"
Il n'est plus possible d'utiliser "array"
et "callable" comme noms d'alias de classe
dans class_alias()
Comparer approximativement des objets non comparables (par exemple des enums,
CurlHandle et d'autre 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.
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.
Il est désormais permis de substituer static par self ou le nom concret de la classe dans les sous-classes finales.
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.
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.
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.
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.
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 lorsqu'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 a été supprimé car il provoque la rupture de diverses hypothèses du moteur.
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.
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.
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.
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_get_option() et ldap_set_option() lèvent désormais une ValueError lorsqu'une option invalide est passée.
Les tables de données Unicode ont été mises à jour vers Unicode 17.0
L'appel au constructeur mysqli sur un objet déjà construit n'est désormais plus possible et génère une Error.
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.
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_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.
L'extension est compilée sans l'option semi-dépréciée PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.
Les arguments du constructeur définis en conjonction avec
PDO::FETCH_CLASS suivent désormais la sémantique habituel 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 utilisez l'affectation
de référence de valeur de tableau générale : $ctor_args = [&$valByRef]
Essayer d'appeler PDOStatement::setFetchMode() pendant un appel à PDO::fetch(), PDO::fetchObject(), PDO::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.
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.
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_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.
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].
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 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.
snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() et SNMP::__construct() lève 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.
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.
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.
ArrayObject n'accepte plus les enums, car la modification des $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.
L'utilisation d'une fonction de la famille printf avec un formatteur 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::__construct(), tidy::parseFile(), tidy::parseString() lève 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.