Sauf mention contraire dans cette section, chaque nouvelle » fonction, » classe, interface, énumération, ou » constante peut entraîner le lancement d'une exception de redéclaration Error.
Les constructions de langage exit() (et die())
se comportent désormais plus comme une fonction.
Cela signifie qu'elles peuvent maintenant être passées comme des callables,
sont affectées par l'instruction strict_types
,
et effectuent désormais les coercitions de type habituelles au lieu de caster
toute valeur non entière en chaîne.
En conséquence, passer des types invalides à exit() et die() entraîne désormais systématiquement le lancement d'une exception TypeError.
Rencontrer une récursion lors de la comparaison entraîne désormais une
exception Error au lieu d'une erreur fatale
E_ERROR
.
La modification indirecte de propriétés en lecture seule dans __clone()()
n'est plus autorisée, par exemple $ref = &$this->readonly
.
C'était déjà interdit pour l'initialisation en lecture seule, et c'était un
oubli dans l'implémentation de la "réinitialisation en lecture seule lors du clonage".
Les constantes PHP_DEBUG
et PHP_ZTS
sont désormais de type bool.
Auparavant, elles étaient de type int.
Le nom des fichiers téléversés et des fichiers créés par la fonction tempnam() est désormais plus long de 13 octets. La longueur totale dépend toujours de la plateforme.
Les constantes de classe suivantes déclarent désormais un type sur leurs constantes :
Plusieurs ressources ont été migrés vers des objets.
La vérification de la valeur de retour à l'aide de is_resource()
doit être remplacée par des vérifications de false
, sauf indication contraire.
Les fonctions DBA acceptent et retournent désormais
Dba\Connection à la place de
ressources dba_connection
.
Les fonctions ODBC acceptent et retournent désormais
Odbc\Result à la place de
ressources odbc_result
.
Les fonctions ODBC acceptent et retournent désormais
Odbc\Connection à la place de
ressources odbc_connection
.
La propriété SoapClient::$httpurl est désormais un objet
Soap\Url plutôt qu'une
ressource soap_url
.
Les vérifications à l'aide de is_resource() (par exemple
is_resource($client->httpurl)
) doivent être remplacées par des
vérifications de null
(par exemple $client->httpurl !== null
).
La propriété SoapClient::$sdl est désormais un objet
Soap\Sdl plutôt qu'une
ressource soap_sdl
.
Les vérifications à l'aide de is_resource() (par exemple
is_resource($client->sdl)
) doivent être remplacées par des
vérifications de null
(par exemple $client->sdl !== null
).
De nouvelles alertes et exceptions ont été ajoutées pour signaler des erreurs de programmation, c'est-à-dire des valeurs invalides fournies en argument.
curl_multi_select() lance désormais une
ValueError si le paramètre
timeout
est inférieur à
0
ou supérieur à PHP_INT_MAX
.
imagejpeg(), imagewebp(), imagepng(), imageavif()
lancent désormais une ValueError si un
quality
invalide est passé.
imageavif() lance désormais une
ValueError si un paramètre
speed
invalide est passé.
imagescale() lance désormais une
ValueError si les paramètres
width
ou height
sont en dehors des limites.
imagescale() lance désormais une
ValueError si une valeur de
mode
invalide est passée.
imagefilter() lance désormais une
ValueError avec le filtre
IMG_FILTER_SCATTER
si les paramètres
sub
ou plus
sont en dehors des limites.
bind_textdomain_codeset(), textdomain(), d()*gettext()
lance désormais une ValueError si un
domain
invalide est passé.
resourcebundle_get(), ResourceBundle::get(), et l'accès aux indices sur un ResourceBundle lancent désormais :
IntlDateFormatter::__construct() lance une
ValueError si le
locale
est invalide.
NumberFormatter::__construct() lance une
ValueError si le
locale
est invalide.
mb_encode_numericentity() et
mb_decode_numericentity() vérifient désormais que
map
est uniquement composé de entiers,
si ce n'est pas le cas, une ValueError est
mb_http_input() lance désormais une
ValueError si le type
est invalide.
mb_http_output() vérifie désormais que
encoding
ne contient pas de caractères nuls,
si c'est le cas, une ValueError est lancée.
odbc_fetch_row() retourne false
lorsque
row
est inférieur ou égal à 0
.
Une alerte est désormais émise dans ce cas.
Les fonctions pcntl_sigprocmask(), pcntl_sigwaitinfo(), et pcntl_sigtimedwait() lancent désormais :
signals
est vide
(sauf pour pcntl_sigprocmask() si le
mode
est SIG_SETMASK
)
signals
n'est pas un entier
signals
n'est pas un numéro de signal valide
La fonction pcntl_sigprocmask() lance désormais une
ValueError si le
mode
n'est pas l'une des SIG_BLOCK
,
SIG_UNBLOCK
, ou SIG_SETMASK
.
La fonction pcntl_sigtimedwait() lance désormais :
seconds
est inférieur à 0
nanoseconds
est inférieur à 0
ou supérieur à 1e9
seconds
et nanoseconds
sont 0
Appeler simplexml_import_dom() avec un objet non-XML lance désormais une TypeError au lieu d'une ValueError.
La fonction round() vérifie désormais la valeur du
mode
et lance une
ValueError pour les modes invalides.
Auparavant, les modes invalides auraient été interprétés comme
PHP_ROUND_HALF_UP
.
La fonction str_getcsv() lance désormais une
ValueError si les arguments
separator
et enclosure
ne font pas un octet de long, ou si l'argument escape
n'est pas un octet de long ou une chaîne vide.
Cela aligne le comportement pour être identique à celui de
fputcsv() et fgetcsv().
La fonction php_uname() lance désormais une
ValueError si le
mode
est invalide.
L'option "allowed_classes"
pour
unserialize() lance désormais des
TypeError et
ValueError si ce n'est pas un
array de noms de classe.
Passer un encodage de caractères invalide à XMLReader::open() ou XMLReader::XML() lance désormais une ValueError.
Passer une chaîne de caractères contenant des octets émettait précédemment une alerte et lance désormais une ValueError.
Passer une chaîne de caractères contenant des octets émettait précédemment une alerte et lance désormais une ValueError.
XSLTProcessor::setParameter() lance désormais une ValueError lorsque ses arguments contiennent des octets nuls. Cela n'a jamais fonctionné correctement en premier lieu, c'est pourquoi une exception est maintenant lancée.
Appeler XSLTProcessor::importStyleSheet() avec un objet non-XML lance désormais une TypeError au lieu d'une ValueError.
L'échec d'appeler une fonction de rappel PHP pendant l'évaluation lance au lieu d'émettre une alerte.
Quelques méthodes DOM retournaient précédemment false
ou une
DOMException PHP_ERR
si un nouveau nœud ne pouvait pas être alloué.
Elles lancent désormais systématiquement une DOMException
INVALID_STATE_ERR
.
Cette situation est extrêmement improbable et la probabilité d'être affecté
est faible.
En conséquence, DOMImplementation::createDocument()
a désormais un type de retour provisoire de DOMDocument
à la place de DOMDocument|false
.
Auparavant, les objets DOMXPath pouvaient être clonés, mais en résultaient en un objet inutilisable. Cela n'est plus possible, et cloner un objet DOMXPath lance désormais une Error.
La méthode DOMImplementation::getFeature() a été supprimée.
La classe GMP est désormais finale et ne peut plus être étendue.
En cas de chaines invalides (celles avec des erreurs d'encodage), mb_substr() interprète désormais les indices de caractères de la même manière que la plupart des autres fonctions mbstring. Cela signifie que les indices de caractères retournés par mb_strpos() peuvent être passés à mb_substr().
Pour les chaines SJIS-Mac (MacJapanese), les indices de caractères passés à mb_substr() font désormais référence aux indices des points de code Unicode qui sont produits lorsque la chaine est convertie en Unicode. C'est significatif car environ 40 caractères SJIS-Mac se convertissent en une séquence de plusieurs points de code Unicode.
La constante non utilisée et non documentée
MYSQLI_SET_CHARSET_DIR
a été supprimée.
La constante MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
a été
supprimée. Cette fonctionnalité n'est pas disponible avec mysqlnd.
Les constantes MYSQLI_STMT_ATTR_CURSOR_TYPE
et
MYSQLI_STMT_ATTR_PREFETCH_ROWS
ont été supprimées.
Ces fonctionnalités n'ont jamais été implémentées,
ni avec mysqlnd ni avec libmysql.
La constante non utilisée MYSQLI_TYPE_INTERVAL
, qui est
actuellement un stub et un alias pour MYSQLI_TYPE_ENUM
,
a été supprimée.
Le code d'erreur signalé pour les délais d'attente du serveur MySQL a été de
2006
à 4031
pour les versions du serveur
Mysql 8.0.24 et supérieures.
La valeur maximale de la configuration
opcache.interned_strings_buffer
sur les architectures 64 bits est désormais 32767
.
Auparavant, elle était de 4095
.
La valeur par défaut de la configuration JIT a changé de
opcache.jit=tracing
et opcache.jit_buffer_size=0
pour opcache.jit=disable
et opcache.jit_buffer_size=64M
, respectivement.
Cela n'affecte pas le comportement observable par défaut, car le JIT est toujours désactivé par défaut. Cependant, il est désormais désactivé via la configuration opcache.jit, plut$ot que opcache.jit_buffer_size. Cela peut affecter les utilisateurs qui ont précédemment activé le JIT via opcache.jit_buffer_size exclusivement, sans spécifier également un mode JIT en utilisant opcache.jit. Pour activer la compilation JIT, définissez la valeur de configuration opcache.jit en conséquence.
Si la compilation JIT est activée, PHP quittera désormais avec une erreur fatale au démarrage si l'initialisation du compilateur JIT a échoué pour une raison quelconque.
Les fonctions pcntl_sigprocmask(),
pcntl_sigwaitinfo(), et
pcntl_sigtimedwait() retournent désormais systématiquement
false
en cas d'échec.
Dans certains cas précédemment, elles pouvaient retourné la valeur -1
.
La version de pcre2lib incluse a été mise à jour en version 10.44.
Par conséquent, cela signifie que {,3}
est désormais reconnu
comme un quantificateur au lieu d'un texte.
De plus, la signification de certaines classes de caractères en mode UCP a changé.
Consultez le » Journal des modifications de PCRE2
pour un journal des modifications complet.
Les attributs Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
et
Pdo\Dblib::ATTR_DATETIME_CONVERT
agissent désormais comme des
attributs booléens au lieu d'attributs entiers.
Donc définir l'attribut via PDO::setAttribute()
et le récupérer via PDO::getAttribute() attend
et retourne un bool.
L'attribut PDO::ATTR_AUTOCOMMIT
agit désormais comme un
attribut booléen au lieu d'un attribut entier.
Donc définir l'attribut via PDO::setAttribute()
et le récupérer via PDO::getAttribute() attend
et retourne un bool.
L'exntension expose désormais certaines API C++ Firebird, donc la construction de cette extension nécessite désormais un compilateur C++. De plus, l'extension doit désormais être compilée contre fbclient 3.0 ou supérieur.
Les attributs PDO::ATTR_AUTOCOMMIT
PDO::ATTR_EMULATE_PREPARES
, et
PDO::MYSQL_ATTR_DIRECT_QUERY
agissent désormais comme des
attributs booléens au lieu d'attributs entiers.
Donc définir l'attribut via PDO::setAttribute()
et le récupérer via PDO::getAttribute() attend
et retourne un bool.
Les informations de connexion DSN, lorsqu'elles sont définies, ont la priorité sur les arguments du constructeur PDO, étant plus proches de ce que la documentation indique.
SimpleXMLElement n'est pas seulement une représentation d'un élément XML, mais c'est aussi un RecursiveIterator. Avant PHP 8.4.0, certaines de ses méthodes (par exemple SimpleXMLElement::asXML() ou SimpleXMLElement::getName()) et le casting de telles instances en chaîne de caractères réinitialisaient implicitement l'itérateur.
Cela pouvait entraîner des boucles infinies inattendues car l'itérateur était réinitialisé. Par exemple :
<?php
$xmlString = "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
$xml = simplexml_load_string($xmlString);
$nodes = $xml->a->b;
foreach ($nodes as $nodeData) {
echo "nodeData: " . $nodeData . "\n";
$xml = $nodes->asXml();
}
formait une boucle infinie.
nodeData: 1 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 // ...
Cependant, ce comportement a été corrigé, et un SimpleXMLElement ne réinitialisera plus implicitement l'itérateur, sauf s'il est explicitement remis à zéro. Cela signifie que l'exemple précédent donnerait maintenant :
nodeData: 1 nodeData: 2 nodeData: 3
SoapClient::$typemap est désormais un array
plutôt qu'une resource.
Les vérifications à l'aide de is_resource() (c'est-à-dire
is_resource($client->typemap)
) doivent être remplacées par des
vérifications de null
(c'est-à-dire $client->typemap !== null
).
L'extension SOAP a gagné une dépendance optionnelle sur l'extension session. Si PHP est compilé sans l'extension session et avec le drapeau de configuration --enable-rtld-now activé, des erreurs de démarrage se produiront désormais si l'extension SOAP est également utilisée. Pour résoudre ce problème, n'utilisez pas rtld-now ou chargez l'extension session.
Lors de l'utilisation de strcspn() avec
characters
étant une chaîne vide,
la longueur de la chaîne est désormais retournée au lieu de s'arrêter
au premier octet nul.
http_build_query() gère désormais correctement les énumérations
stream_bucket_make_writeable() et stream_bucket_new() retournent désormais une instance de StreamBucket à la place d'une instance de stdClass.
Les echecs dans le constructeur lancent désormais des exceptions plutôt que d'émettre des alertes et d'avoir un objet cassé.
Les fonctions xml_set_()*_handler()
déclarent désormais et vérifient une signature
effective de callable|string|null pour les
paramètres handler
.
De plus les valeurs de type string correspondant à des noms de méthode,
d'objet défini avec xml_set_object() sont désormais vérifiées pour
voir si la méthode existe sur la classe de l'objet précédemment passé.
Cela signifie que xml_set_object() doit maintenant toujours être
appelée avant de définir des noms de méthode en tant que callable.
Passer une chaîne vide pour désactiver le gestionnaire est toujours autorisé,
mais déprécié.
De plus, avec xml_set_object() et le passage de chaînes non-callable est déprécié. Il est recommandé de remplacer de telles instances par un callable se référant directement à la méthode.