FFI::load() est désormais autorisé pendant le préchargement quand opcache.preload_user est l'utilisateur système actuel. Précédemment, appeler FFI::load() n'était pas possible pendant le préchargement si la directive opcache.preload_user était définie.
Les test FPM CLI échouent désormais si le chemin du socket est plus long que ce que l'OS supporte.
Dans les SAPI CLI et phpdbg, le préchargement ne nécessite plus que la directive opcache.preload_user soit définie lorsque PHP est exécuté en tant que root. Dans les autres SAPI, cette directive est requise lorsque PHP est exécuté en tant que root car le préchargement est effectué avant que le SAPI ne passe à un utilisateur non privilégié.
Bloquer fread() sur une connexion de socket retourne immédiatement s'il y a des données tamponnées au lieu d'attendre plus de données.
Un stream de mémoire ne retourne plus d'erreur si le décalage de recherche est au-delà de la fin. A la place, la mémoire sera augmentée à la prochaine écriture et les données entre l'ancienne fin et le décalage sont remplies de zéros, similaire à la façon dont les fichiers fonctionnent.
Les opérations d'accès stat() comme file_exists() et similaires utiliseront désormais le chemin réel au lieu du chemin du stream. Ceci est cohérent avec l'ouverture du stream.
gc_status() a ajouté les 8 champs suivantes:
"running"
=> bool"protected"
=> bool"full"
=> bool"buffer_size"
=> int"application_time"
=> float: Le temps total d'application,
en secondes (y compris le temps de collecte)"collector_time"
=> float: Le temps passé à collecter
les cycles, en secondes (y compris le temps de destructeur et le temps de libération)"destructor_time"
=> float: Le temps passé à exécuter
les destructeurs pendant la collecte des cycles, en secondes"free_time"
=> float: Le temps passé à libérer les valeurs
pendant la collecte des cycles, en secondesclass_alias() supporte désormais la création d'un alias sur les classes internes.
Changer open_basedir à l'exécution
en utilisant ini_set('open_basedir', ...);
n'accepte plus les chemins
contenant le répertoire parent (..
). Précédemment,
seuls les chemins commençant par ..
étaient interdits. Ceci
pouvait facilement être contourné en préfixant le chemin par ./
.
Les gestionnaires d'exceptions utilisateur attrapent désormais les exceptions pendant l'arrêt.
Le HTML résultant de highlight_string() et
highlight_file() a changé.
Les espaces entre les balises HTML extérieures sont supprimés. Les sauts de ligne et les espaces
ne sont plus convertis en entités HTML. Tout le HTML est maintenant enveloppé dans une balise
<pre>
. La balise <span>
extérieure a été fusionnée
avec la balise <code>
.
easter_date() supporte désormais les années de 1970 à 2 000 000 000 sur les systèmes 64 bits, précédemment il ne supportait que les années de 1970 à 2037.
curl_getinfo() supporte désormais deux nouvelles constantes :
CURLINFO_CAPATH
et
CURLINFO_CAINFO
. Si option est null
, les deux clés
suivant sont présentes :
"capath"
et "cainfo"
.
Le type de retour de DOMCharacterData::appendData() a été changé en true.
DOMDocument::loadHTML(),
DOMDocument::loadHTMLFile(), et
DOMDocument::loadXML() ont désormais un type de
retour provisoire de bool. Précédemment, cela était documenté
comme ayant un type de retour de DOMDocument|bool
, mais, à partir de PHP 8.0.0,
DOMDocument
ne peut pas être retourné car il n'est plus statiquement appelable.
La signature de imagerotate() a changé.
Le paramètre $ignore_transparent
a été supprimé,
car il était ignoré depuis PHP 5.5.0.
datefmt_set_timezone() (et ses alias
IntlDateformatter::setTimeZone())
retourn désormais true
en cas de succès, avant null
étais retourné.
IntlBreakiterator::setText() retourne désormais false
en cas d'échec, précédemment null
était retourné.
Il retourne désormais true
en cas de succès, précédemment null
était retourné.
IntlChar::enumCharNames() retourne désormais un booléen.
Précédemment, il retournait null
en cas de succès et false
en cas d'échec.
IntlDateFormatter::__construct() lance une exception U_ILLEGAL_ARGUMENT_ERROR
lorsqu'une locale invalide a été définie.
mb_strtolower() et mb_convert_case()
implémentent des règles de casse conditionnelles pour la lettre grecque sigma.
Pour mb_strtolower(),
la casse conditionnelle s'applique uniquement aux modes MB_CASE_LOWER
,
et MB_CASE_TITLE
, pas aux modes
MB_CASE_LOWER_SIMPLE
et
MB_CASE_TITLE_SIMPLE
.
mb_decode_mimeheader() interprète les tirets bas dans
les mots encodés MIME QPrint comme requis par la RFC 2047 ; ils sont
convertis en espaces.
Les tirets bas doivent être encodés en "=5F"
dans de tels mots
encodés MIME.
Dans de rare cas, mb_encode_mimeheader() va encoder sa chaîne de caractères d'entrée là où elle la passerait en ASCII brut en PHP 8.2.
mb_encode_mimeheader() ne supprime plus les octets NUL (zéro) lors de l'encodage QPrint de la chaine d'entrée. Cela corrompait précédemment les chaines dans certains encodages de texte, en particulier UTF-16 et UTF-32, par mb_encode_mimeheader.
mb_detect_encoding() en mode "non-strict" se comporte
désormais comme décrit dans la documentation.
Auparavant, il retournait false
si le même octet (par exemple, le premier
octet) de la chaine d'entrée était invalide dans tous les encodages candidats.
Plus généralement, il éliminait les encodages candidats de la considération
lorsqu'un octet invalide était vu, et si le même octet d'entrée éliminait
tous les encodages restants encore sous considération, il retournait false
.
D'autre part, si tous les encodages candidats sauf un étaient éliminés
de la considération, il retournait le dernier restant sans tenir compte
du nombre d'erreurs d'encodage qui pourraient être rencontrées plus tard dans la chaine.
Ceci est différent du comportement décrit dans la documentation, qui
dit : "Si strict est défini sur false, l'encodage le plus proche
sera retourné."
mysqli_fetch_object() lance désormais une
ValueError au lieu d'une Exception
lorsque l'argument $constructor_args
n'est pas vide
avec la classe n'ayant pas de constructeur.
mysqli_poll() lance désormais une ValueError
lorsque ni l'argument $read
ni l'argument $error
ne sont passés.
mysqli_field_seek() et mysqli_result::field_seek() précise désormais le type de retour comme true au lieu de bool.
odbc_autocommit() accepte désormais null
pour le
paramètre $enable
.
Passer null
a le même comportement que passer un seul paramètre,
indiquant si la fonctionnalité autocommit est activée ou non.
pg_fetch_object() lance désormais une
ValueError à la place d'une Exception
lorsque l'argument$constructor_args
n'est pas vide
avec la classe n'ayant pas de constructeur.
pg_insert() lance désormais une ValueError au lieu d'une Exception lorsque la table spécifiée est invalide.
pg_insert() et pg_convert() lancent
une ValueError ou une TypeError
à la place d'un E_WARNING
lorsque la valeur/type d'un champ
ne correspond pas correctement au type de PostgreSQL.
Le paramètre $row
de
pg_fetch_result(),
pg_field_prtlen(), et
pg_field_is_null() est désormais nullable.
Changement de mt_srand() et srand() pour
ne pas vérifier le nombre d'arguments pour déterminer si une graine
aléatoire doit être utilisée. Passer null
générera une graine aléatoire, 0
utilisera zéro comme graine. Les fonctions sont désormais cohérentes avec
Random\Engine\Mt19937::__construct().
Le type de retour de ReflectionClass::getStaticProperties() n'est désormais plus nullable.
Le E_NOTICE
émis par unserialize()
a été promu en E_WARNING
.
unserialize() émet désormais un E_WARNING
si l'entrée contient des octets non consommés.
array_pad() n'est désormais limité que par le nombre maximum d'éléments qu'un tableau peut contenir. Auparavant, il était seulement possible d'ajouter au plus 1 048 576 éléments à la fois.
strtok() lance maintenant un E_WARNING
si le
token n'est pas fourni lors du démarrage de la tokenisation.
password_hash() chaîne désormais l'exception sous-jacente
Random\RandomException
dans la $previous
Exception
de ValueError
lorsque la génération de sel échoue.
Si un tableau est utilisé comme $command
pour
proc_open(), il doit désormais avoir au moins un élément
non vide. Sinon, une ValueError
est lancée.
proc_open() retourne désormais false
si le tableau $command
est une commande invalide au lieu d'un objet de ressource qui produit un avertissement plus tard.
C'était déjà le cas pour Windows, mais c'est maintenant aussi le cas si une implémentation posix_spawn
est utilisée (la plupart des plates-formes Linux, BSD et MacOS). Il reste
quelques anciennes plates-formes où ce comportement n'a pas changé car posix_spawn n'est pas
pris en charge là-bas.
array_sum() et array_product() émettent désormais un avertissement lorsque les valeurs du tableau ne peuvent pas être converties en int/float. Auparavant, les tableaux et les objets étaient ignorés tandis que chaque autre valeur était convertie en int. De plus, les objets qui définissent une conversion numérique (par exemple GMP) sont désormais convertis au lieu d'être ignorés.
Le $decimals
de number_format()
gère désormais les entiers négatifs.
Arrondir avec une valeur négative pour $decimals
signifie
que $num
est arrondi à $decimals
chiffres significatifs avant le séparateur décimal.
Auparavant, les entiers négatifs pour $decimals
étaient
silencieusement ignorés et le nombre était arrondi à zéro décimales.
Un nouveau argument $before_needle
a été ajouté à
strrchr(). Il se comporte comme son homologue dans les
fonctions strstr() ou stristr().
str_getcsv() et fgetcsv() retournent désormais une chaine vide au lieu d'une chaine avec un seul octet nul pour le dernier champ qui ne contient qu'une enceinte non terminée.
Utiliser les opérateurs d'incrémentation/décrémentation
(++
/--
) sur des valeurs de type
bool émet désormais des avertissements.
Cela est dû au fait que cela n'a actuellement aucun effet, mais se comportera comme
$bool += 1
à l'avenir.
Using the increment/decrement
Utiliser l'opérateur de décrémentation
(--
) sur des valeurs de type null émet désormais des avertissements.
Cela est dû au fait que cela n'a actuellement aucun effet, mais se comportera comme
$null -= 1
à l'avenir.
Les objets internes qui implémentent un cast _IS_NUMBER mais pas un gestionnaire do_operator
qui remplace l'addition et la soustraction peuvent désormais être incrémentés et décrémentés
comme si on faisait $o += 1
ou $o -= 1
.
Le mécanisme de durée de vie du DOM a été retravaillé de telle sorte que les nœuds implicitement supprimés peuvent toujours être récupérés. Auparavant, cela entraînait une exception.
La classe SQLite3 lance une SQLite3Exception (extension de Exception) à la place de Exception.
Le code d'erreur SQLite est désormais passé dans le code d'erreur de l'exception au lieu d'être inclus dans le message d'erreur.
Les paramètres INI assert.*
ont été dépréciés.
Cela comprend les paramètres INI suivants :
zend.max_allowed_stack_size
est une nouvelle directive INI pour définir la taille maximale de la pile autorisée.
Les valeurs possibles sont 0
(détecter la taille maximale de la pile du processus ou du thread),
-1
(pas de limite), ou un nombre positif d'octets.
La valeur par défaut est 0
.
Lorsqu'il n'est pas possible de détecter la taille maximale de la pile du processus ou du thread,
une valeur par défaut système connue est utilisée.
Définir cette valeur trop élevée a le même effet que la désactivation de la limite de taille de la pile.
Les fibres utilisent
fiber.stack_size
comme taille de pile maximale autorisée.
Une Error est lancée lorsque la pile d'appel du processus dépasse
zend.max_allowed_stack_size-zend.reserved_stack_size
octets, pour éviter les erreurs de segmentation dues à un dépassement de pile,
dans le but de faciliter le débogage.
La taille de la pile augmente pendant les récursions non contrôlées impliquant des fonctions internes
ou les méthodes magiques
__toString(),
__clone(),
__sleep(),
__destruct().
Cela n'est pas lié aux débordements de tampon de pile, et n'est pas une fonctionnalité de sécurité.
zend.reserved_stack_size est une nouvelle directive INI pour définir la taille de la pile réservée, en octets. Cela est soustrait de la taille maximale de la pile autorisée, en tant que tampon, lors de la vérification de la taille de la pile.
Itérer sur un DOMNodeList utilise désormais un cache. Par conséquent, demander des éléments ne prend plus de temps quadratique par défaut.
Obtenir le contenu textuel des nœuds évite désormais une allocation, ce qui entraîne un gain de performance.
DOMChildNode::remove() s'exécute désormais en O(1) performance.
Le drapeau file() pour la vérification des erreurs est désormais environ 7% plus rapide.
RecursiveDirectoryIterator effectue désormais moins d'E/S lors du parcours d'un répertoire.