diff --git a/appendices/migration86.xml b/appendices/migration86.xml
new file mode 100644
index 0000000000..06e3ac0152
--- /dev/null
+++ b/appendices/migration86.xml
@@ -0,0 +1,57 @@
+
+
+
+ Migration de PHP 8.5.x vers PHP 8.6.x
+
+
+ Cette nouvelle version mineure apporte un certain nombre de
+ nouvelles fonctionnalités et
+ quelques incompatibilités
+ qui devraient être testées avant de passer à une nouvelle version de PHP en
+ production.
+
+
+
+ &manual.migration.seealso;
+ 7.1.x,
+ 7.2.x,
+ 7.3.x,
+ 7.4.x,
+ 8.0.x,
+ 8.1.x,
+ 8.2.x,
+ 8.3.x,
+ 8.4.x,
+ 8.5.x.
+
+
+ &appendices.migration86.new-features;
+ &appendices.migration86.new-classes;
+ &appendices.migration86.new-functions;
+ &appendices.migration86.constants;
+ &appendices.migration86.incompatible;
+ &appendices.migration86.deprecated;
+ &appendices.migration86.other-changes;
+ &appendices.migration86.windows-support;
+
+
+
diff --git a/appendices/migration86/constants.xml b/appendices/migration86/constants.xml
new file mode 100644
index 0000000000..251151ee35
--- /dev/null
+++ b/appendices/migration86/constants.xml
@@ -0,0 +1,188 @@
+
+
+
+ Nouvelles constantes globales
+
+
+ Core
+
+
+
+ ARRAY_FILTER_USE_VALUE
+
+
+ STREAM_CRYPTO_STATUS_NONE
+
+
+ STREAM_CRYPTO_STATUS_WANT_READ
+
+
+ STREAM_CRYPTO_STATUS_WANT_WRITE
+
+
+
+
+
+ cURL
+
+
+
+ CURLINFO_SIZE_DELIVERED (libcurl >= 8.20.0)
+
+
+ CURLOPT_SEEKFUNCTION
+
+
+ CURL_SEEKFUNC_OK
+
+
+ CURL_SEEKFUNC_FAIL
+
+
+ CURL_SEEKFUNC_CANTSEEK
+
+
+ CURL_READFUNC_ABORT
+
+
+
+
+
+ MySQLi
+
+
+
+ MYSQLI_OPT_COMPRESS
+
+
+
+
+
+ OpenSSL
+
+
+ OPENSSL_RSA_PSS_SALTLEN_DIGEST
+ OPENSSL_RSA_PSS_SALTLEN_AUTO
+ OPENSSL_RSA_PSS_SALTLEN_MAX
+
+
+
+
+ Sockets
+
+
+
+ TCP_USER_TIMEOUT (Linux uniquement)
+
+
+ AF_UNSPEC
+
+
+ EAI_BADFLAGS
+
+
+ EAI_NONAME
+
+
+ EAI_AGAIN
+
+
+ EAI_FAIL
+
+
+ EAI_NODATA
+
+
+ EAI_FAMILY
+
+
+ EAI_SOCKTYPE
+
+
+ EAI_SERVICE
+
+
+ EAI_ADDRFAMILY
+
+
+ EAI_SYSTEM
+
+
+ EAI_OVERFLOW
+
+
+ EAI_INPROGRESS
+
+
+ EAI_CANCELED
+
+
+ EAI_NOTCANCELED
+
+
+ EAI_ALLDONE
+
+
+ EAI_INTR
+
+
+ EAI_IDN_ENCODE
+
+
+ SO_DETACH_REUSEPORT_BPF (Linux uniquement)
+
+
+
+
+
+ Sodium
+
+
+ SODIUM_CRYPTO_IPCRYPT_BYTES
+ SODIUM_CRYPTO_IPCRYPT_KEYBYTES
+ SODIUM_CRYPTO_IPCRYPT_ND_KEYBYTES
+ SODIUM_CRYPTO_IPCRYPT_ND_TWEAKBYTES
+ SODIUM_CRYPTO_IPCRYPT_ND_INPUTBYTES
+ SODIUM_CRYPTO_IPCRYPT_ND_OUTPUTBYTES
+ SODIUM_CRYPTO_IPCRYPT_NDX_KEYBYTES
+ SODIUM_CRYPTO_IPCRYPT_NDX_TWEAKBYTES
+ SODIUM_CRYPTO_IPCRYPT_NDX_INPUTBYTES
+ SODIUM_CRYPTO_IPCRYPT_NDX_OUTPUTBYTES
+ SODIUM_CRYPTO_IPCRYPT_PFX_KEYBYTES
+ SODIUM_CRYPTO_IPCRYPT_PFX_BYTES
+ SODIUM_CRYPTO_KEM_PUBLICKEYBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_SECRETKEYBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_CIPHERTEXTBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_SHAREDSECRETBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_SEEDBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_KEYPAIRBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_PUBLICKEYBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_SECRETKEYBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_CIPHERTEXTBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_SHAREDSECRETBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_SEEDBYTES (libsodium >= 1.0.22)
+ SODIUM_CRYPTO_KEM_MLKEM768_KEYPAIRBYTES (libsodium >= 1.0.22)
+
+
+
+
+
diff --git a/appendices/migration86/deprecated.xml b/appendices/migration86/deprecated.xml
new file mode 100644
index 0000000000..f0fc4e2581
--- /dev/null
+++ b/appendices/migration86/deprecated.xml
@@ -0,0 +1,638 @@
+
+
+
+ Fonctionnalités dépréciées
+
+
+ PHP Core
+
+
+ Utilisation de "namespace" comme nom de constante de classe
+
+
+
+ Déclarer une constante de classe
+ nommée namespace est désormais déprécié.
+ namespace est un mot-clé semi-réservé, et ce nom est
+ réservé pour une éventuelle syntaxe future, telle qu'une pseudo-constante
+ ::namespace analogue à ::class.
+ Les méthodes et les propriétés statiques nommées namespace
+ ne sont pas concernées.
+ Renommer la constante, par exemple en NAMESPACE_NAME.
+
+
+
+
+
+ Retourner depuis un bloc finally
+
+
+
+ Utiliser l'instruction return dans un bloc &finally;
+ est désormais déprécié, et émet un avertissement de dépréciation à la
+ compilation.
+ Un tel return écarte silencieusement une exception
+ lancée par le bloc try ou catch
+ associé, ou écrase la valeur qu'il retourne, si bien que les échecs
+ disparaissent sans laisser de trace.
+ Il faut déplacer le return hors du bloc
+ finally ; le même résultat peut toujours s'exprimer sans
+ lui.
+
+
+
+
+
+
+
+
+
+
+
+ Type de retour nullable pour __debugInfo()
+
+
+ Déclarer un type de retour
+ arraynull pour
+ __debugInfo() est
+ désormais déprécié.
+ Retourner &null; depuis cette méthode était
+ déjà
+ déprécié en PHP 8.5, le type de retour nullable ne décrit donc plus
+ un comportement valide.
+ Il faut déclarer array à la place.
+
+
+
+
+
+ Retourner des valeurs depuis __construct() et __destruct()
+
+
+
+ Retourner une valeur depuis
+ __construct() ou
+ __destruct() est
+ désormais déprécié, et émet un avertissement de dépréciation à la
+ compilation.
+ Ces méthodes ne peuvent pas déclarer de type de retour, et leur valeur de
+ retour ne peut jamais être observée en usage normal, ce qui rendait le
+ fait de retourner une valeur au mieux déroutant.
+ Utiliser return; sans valeur pour ignorer le reste de la
+ logique reste autorisé, de même que l'appel manuel de ces méthodes.
+
+
+
+ Pour la même raison, utiliser yield pour faire de
+ __construct() ou
+ __destruct() un
+ générateur est désormais
+ déprécié.
+
+
+
+
+
+ Nommer une fonction readonly
+
+
+
+ Déclarer une fonction nommée readonly est désormais
+ déprécié.
+ readonly
+ est un mot-clé réservé ; une exception a été ajoutée à l'analyseur lexical
+ en PHP 8.1 uniquement pour maintenir en état de fonctionnement une
+ fonction WordPress existante portant ce nom, et aucun autre mot-clé de PHP
+ ne bénéficie d'un traitement spécial de ce genre.
+ Il faut renommer la fonction.
+
+
+
+
+
+ Utilisation de let, is ou _ comme identifiant
+
+
+
+
+
+
+ Utiliser let ou is comme nom de
+ classe, d'interface, de trait, d'énumération, de fonction ou de constante
+ (y compris via define) est désormais déprécié, de
+ même que leur utilisation comme alias dans un appel à
+ class_alias ou dans une déclaration
+ use, use function ou
+ use const.
+ Ces noms sont réservés comme mots-clés pour d'éventuelles fonctionnalités
+ futures : let pour la portée de bloc et
+ is pour le filtrage par motifs.
+ Il faut renommer les symboles concernés.
+
+
+
+ La
+ dépréciation
+ de _ comme nom de classe en PHP 8.4 est étendue
+ aux constantes : déclarer une constante nommée _ avec
+ const ou define, et utiliser
+ _ comme alias d'une classe ou d'une constante dans une
+ déclaration use, sont désormais dépréciés.
+ Les fonctions nommées _, y compris l'alias
+ _ de gettext, ne sont pas
+ concernées.
+
+
+
+
+
+ Troisième argument de define()
+
+
+
+ Passer l'argument case_insensitive à
+ define est désormais déprécié.
+ Les constantes insensibles à la casse ont été supprimées en PHP 8.0, et
+ depuis lors cet argument est ignoré.
+ Passer explicitement &false; émet désormais un avertissement de
+ dépréciation.
+ Passer &true; continue d'émettre un avertissement, dont le message précise
+ désormais que cela deviendra une erreur en PHP 9.0.
+ Il faut omettre l'argument.
+
+
+
+
+
+ is_a() et is_subclass_of() avec une chaîne lorsque allow_string vaut false
+
+
+
+
+ Appeler is_a ou is_subclass_of
+ avec une chaîne comme premier argument alors que
+ allow_string vaut &false; est désormais déprécié.
+ Dans ce cas, les fonctions retournent toujours &false;, même lorsque la
+ classe est déjà chargée, un tel appel révèle donc un bogue.
+ Pour éviter de déclencher le chargement automatique, il faut d'abord
+ vérifier avec class_exists en désactivant le
+ chargement automatique, puis appeler la fonction avec
+ allow_string défini à &true;.
+
+
+
+
+
+ metaphone()
+
+
+
+ La fonction metaphone est désormais dépréciée.
+ Elle implémente l'algorithme Metaphone original de 1990, qui est limité aux
+ règles de prononciation de l'anglais et a depuis longtemps été supplanté
+ par Double Metaphone et Metaphone 3.
+ Les algorithmes phonétiques sont spécifiques à une langue et fréquemment
+ mis à jour ; ils sont donc mieux servis par une bibliothèque en espace
+ utilisateur, qu'il faut utiliser à la place.
+
+
+
+
+
+ Plus de 16 filtres dans une URL php://filter
+
+
+
+ Utiliser plus de 16 filtres dans une URL
+ php://filter sans configurer l'option
+ de contexte de flux filter.max_filter_count émet
+ désormais un avertissement de dépréciation.
+ Les longues chaînes de filtres n'ont aucun usage légitime connu, mais
+ sont à la base d'une classe d'attaques qui transforment une inclusion de
+ fichier local ou une lecture arbitraire de fichier en exécution de code à
+ distance.
+ Lorsque filter.max_filter_count est défini
+ explicitement, le dépasser est déjà une erreur : l'ouverture du flux
+ échoue avec un avertissement.
+
+
+
+ Le code qui a besoin de davantage de filtres devrait soit les ajouter avec
+ stream_filter_append ou
+ stream_filter_prepend, qui ne sont pas limitées, soit
+ relever la limite via l'option de contexte, par exemple globalement avec
+ stream_context_set_default.
+
+
+
+
+
+ Passer des objets à array_walk(), array_walk_recursive() et http_build_query()
+
+
+
+
+ Passer un objet comme argument array à
+ array_walk ou
+ array_walk_recursive est désormais déprécié.
+ Un petit nombre de fonctions interprètent silencieusement un objet comme
+ le tableau de ses propriétés visibles.
+ Modifier ces propriétés via une fonction de rappel par référence viole la
+ sémantique de
+ readonly
+ et peut corrompre les cas d'énumération, et
+ array_walk_recursive ne descend de toute façon pas
+ dans les objets imbriqués.
+ Il faut d'abord appeler get_object_vars sur l'objet
+ et passer le tableau obtenu.
+
+
+
+ Passer un objet comme argument data à
+ http_build_query est désormais déprécié.
+ Les objets rencontrés comme valeurs dans data
+ émettent désormais aussi un avertissement de dépréciation lorsqu'ils sont
+ interprétés comme des tableaux.
+ Traiter les objets comme des tableaux a été une source récurrente de
+ confusion, en particulier pour les objets
+ Stringable, dont les utilisateurs attendent
+ qu'ils soient plutôt convertis en chaîne.
+ Il faut convertir les objets en tableaux avec
+ get_object_vars, récursivement si nécessaire, avant
+ d'appeler la fonction.
+
+
+
+
+
+ is_double(), is_long(), is_integer() et doubleval()
+
+
+
+
+
+
+ Suite à la
+ dépréciation
+ des noms de cast non canoniques en PHP 8.5, les alias de fonctions
+ qui portent ces mêmes noms de types obsolètes sont désormais dépréciés.
+ Ils se comportent de manière identique à leurs équivalents canoniques, qui
+ doivent être utilisés à la place :
+
+
+ is_double => is_float
+ is_long => is_int
+ is_integer => is_int
+ doubleval => floatval
+
+
+
+
+
+
+ strcoll() et SORT_LOCALE_STRING
+
+
+
+
+ La fonction strcoll est désormais dépréciée.
+ Elle compare des chaînes selon le paramètre LC_COLLATE
+ de la locale courante, qui est un état global du processus défini via
+ setlocale et que n'importe quelle bibliothèque peut
+ modifier ; elle n'est pas compatible avec les données binaires,
+ contrairement à toutes les autres fonctions de comparaison de chaînes, et
+ certaines locales n'implémentent pas des règles de collation correctes.
+ Il faut utiliser à la place Collator::compare de
+ l'extension intl, qui est précise et
+ dispose de règles de collation à jour.
+
+
+
+ Le drapeau SORT_LOCALE_STRING des fonctions de tri
+ est désormais déprécié pour les mêmes raisons, puisqu'il trie en utilisant
+ strcoll.
+ Il faut utiliser à la place l'une des méthodes suivantes de la classe
+ Collator :
+
+
+ Collator::sort
+ Collator::asort
+ Collator::sortWithSortKeys
+
+
+
+
+
+
+
+
+ Bzip2
+
+
+ Passer un objet comme paramètres des filtres de flux
+ bzip2.compress et
+ bzip2.decompress est désormais déprécié, car seul un tableau
+ associatif est documenté et pris en charge.
+ Il faut d'abord appeler get_object_vars sur l'objet et
+ passer le tableau obtenu.
+
+
+
+
+
+
+ GMP
+
+
+ Les opérateurs de décalage (<<,
+ >>) et d'exponentiation (**)
+ sur les objets GMP émettent désormais un
+ avertissement de dépréciation lorsque l'opérande de droite est un
+ float dont la conversion en int perd en
+ précision, par cohérence avec la dépréciation des conversions implicites
+ de float vers int avec perte ailleurs dans le langage.
+
+
+
+
+
+ MBString
+
+
+ Les fonctions mbregex ont été dépréciées, car la bibliothèque Oniguruma
+ sous-jacente n'est plus maintenue ; sa maintenance a pris fin en avril
+ 2025.
+ Les fonctions seront supprimées en PHP 9.0.
+ Pour la plupart des cas d'usage, les fonctions
+ PCRE avec le modificateur u
+ constituent un remplacement approprié.
+ Les fonctions concernées sont :
+
+
+
+ mb_ereg
+ mb_ereg_match
+ mb_ereg_replace
+ mb_ereg_replace_callback
+ mb_ereg_search
+ mb_ereg_search_getpos
+ mb_ereg_search_getregs
+ mb_ereg_search_init
+ mb_ereg_search_pos
+ mb_ereg_search_regs
+ mb_ereg_search_setpos
+ mb_eregi
+ mb_eregi_replace
+ mb_regex_encoding
+ mb_regex_set_options
+ mb_split
+
+
+
+
+ La constante MB_ONIGURUMA_VERSION et les directives
+ INI
+ mbstring.regex_retry_limit
+ et
+ mbstring.regex_stack_limit
+ sont dépréciées en même temps.
+
+
+
+ Passer un objet comme argument vars à
+ mb_convert_variables est désormais déprécié, car les
+ objets sont silencieusement interprétés comme le tableau de leurs
+ propriétés visibles.
+ Il faut d'abord appeler get_object_vars sur l'objet,
+ ou utiliser mb_convert_encoding, qui convertit
+ récursivement les tableaux et retourne le résultat au lieu de modifier son
+ argument sur place.
+
+
+
+
+
+
+ MySQLi
+
+
+ La fonction mysqli_get_charset et la méthode
+ mysqli::get_charset sont désormais dépréciées,
+ sans remplacement.
+ Elles exposent des détails d'implémentation internes du jeu de caractères
+ qui n'ont plus de sens depuis le passage à mysqlnd ; en particulier, la
+ collation rapportée ne correspond pas à la collation définie par le
+ serveur.
+ Pour obtenir le nom du jeu de caractères courant, il faut utiliser
+ mysqli_character_set_name ou
+ mysqli::character_set_name.
+
+
+
+
+ La fonction mysqli_stmt_init et la méthode
+ mysqli::stmt_init sont désormais dépréciées.
+ Elles créent un objet de requête vide qui doit encore être préparé avant
+ utilisation, et sont une source d'objets de requête laissés dans un état
+ incohérent.
+ Il faut utiliser à la place mysqli_prepare ou
+ mysqli::prepare, qui préparent la requête en une
+ seule étape.
+ Pour la même raison, appeler le constructeur
+ mysqli_stmt::__construct sans le paramètre
+ query est désormais déprécié ; il faut passer la
+ requête au constructeur.
+
+
+
+
+
+
+ Reflection
+
+
+ Appeler ReflectionProperty::setValue ou
+ ReflectionProperty::setRawValue avec un objet qui
+ n'est pas une instance de la classe dans laquelle la propriété a été
+ déclarée est désormais déprécié.
+ Contrairement aux autres méthodes de ReflectionProperty,
+ qui lancent une exception pour de tels objets, ces méthodes définissent
+ silencieusement une propriété sur l'objet sans rapport, ce qui n'est pas
+ mieux qu'une assignation normale et est conceptuellement erroné.
+
+
+
+
+ Passer un objet à ReflectionMethod::invoke ou
+ ReflectionMethod::invokeArgs lors de l'appel d'une
+ méthode statique est désormais déprécié.
+ Les méthodes statiques n'ont pas de $this : l'objet
+ était donc entièrement ignoré et jamais validé.
+ Il faut passer &null; à la place.
+
+
+
+
+
+
+ Session
+
+
+ Passer à session_set_save_handler un objet qui
+ n'implémente pas à la fois les méthodes
+ SessionIdInterface::create_sid et
+ SessionUpdateTimestampHandlerInterface::validateId
+ est désormais déprécié, quelles que soient les interfaces que l'objet
+ déclare.
+ Ces méthodes sont nécessaires pour qu'un gestionnaire de sauvegarde se
+ comporte correctement avec
+ session.use_strict_mode,
+ qui est
+ activé par défaut à partir
+ de PHP 8.6 et atténue la fixation de session.
+
+
+
+
+ En conséquence, un avertissement de dépréciation est désormais émis
+ lorsqu'une classe implémente SessionHandlerInterface
+ sans définir les méthodes
+ SessionIdInterface::create_sid ou
+ SessionUpdateTimestampHandlerInterface::validateId.
+ En PHP 9.0, ces méthodes seront déplacées de
+ SessionIdInterface et
+ SessionUpdateTimestampHandlerInterface vers
+ SessionHandlerInterface, où elles seront
+ obligatoires.
+ Il faut dès maintenant implémenter les deux méthodes sur les gestionnaires
+ de sauvegarde personnalisés.
+
+
+
+
+
+ SPL
+
+
+ La fonction spl_classes est désormais dépréciée.
+ Aucune autre extension n'expose une telle fonction, et l'extension
+ Reflection est toujours disponible.
+ Il faut utiliser à la place
+ ReflectionExtension::getClassNames.
+
+
+
+
+ La fonction spl_object_hash est désormais dépréciée.
+ À partir de PHP 8.1, sa valeur de retour n'est rien de plus qu'un
+ spl_object_id reformaté, et son nom est trompeur car
+ la valeur n'est pas dérivée du contenu de l'objet.
+ La forme chaîne est aussi source d'erreurs : deux empreintes peuvent être
+ égales avec une comparaison souple parce que ce sont toutes deux des
+ chaînes numériques.
+ Il faut utiliser à la place spl_object_id.
+
+
+
+
+ Les méthodes suivantes d'ArrayIterator sont
+ désormais dépréciées.
+ Elles n'existent que parce qu'ArrayIterator
+ partageait historiquement son implémentation avec
+ ArrayObject ; la plupart n'ont guère de sens sur un
+ itérateur et empêchent d'optimiser son implémentation.
+ Les méthodes correspondantes d'ArrayObject ne sont
+ pas dépréciées.
+
+
+
+ ArrayIterator::getFlags
+ ArrayIterator::setFlags
+ ArrayIterator::asort
+ ArrayIterator::ksort
+ ArrayIterator::uasort
+ ArrayIterator::uksort
+ ArrayIterator::natsort
+ ArrayIterator::natcasesort
+ ArrayIterator::unserialize
+ ArrayIterator::serialize
+
+
+
+
+ Les méthodes CSV de SplFileObject sont désormais
+ dépréciées.
+ Leurs incohérences de conception historiques, davantage mises en évidence
+ par les arguments nommés, les ont rendues de plus en plus difficiles à
+ maintenir, et la gestion du CSV n'a pas naturellement sa place dans
+ SplFileObject.
+ Il faut utiliser à la place fgetcsv et
+ fputcsv sur un flux.
+
+
+
+ SplFileObject::fgetcsv
+ SplFileObject::fputcsv
+ SplFileObject::setCsvControl
+ SplFileObject::getCsvControl
+
+
+
+
+
+
+ Zlib
+
+
+ Passer un objet comme paramètres des filtres de flux
+ zlib.deflate et zlib.inflate
+ est désormais déprécié, car seul un tableau associatif est documenté et
+ pris en charge.
+ Il faut d'abord appeler get_object_vars sur l'objet et
+ passer le tableau obtenu.
+
+
+
+
+ Passer un objet comme argument options à
+ deflate_init ou inflate_init est
+ désormais déprécié, car les objets sont silencieusement interprétés comme
+ le tableau de leurs propriétés visibles.
+ Il faut d'abord appeler get_object_vars sur l'objet et
+ passer le tableau obtenu.
+
+
+
+
+
+
+
diff --git a/appendices/migration86/incompatible.xml b/appendices/migration86/incompatible.xml
new file mode 100644
index 0000000000..1f5238cdc0
--- /dev/null
+++ b/appendices/migration86/incompatible.xml
@@ -0,0 +1,921 @@
+
+
+
+ Changements non rétrocompatibles
+
+
+ PHP Core
+
+
+ foreach par référence après compactage d'un tableau
+
+
+ Les boucles foreach par
+ référence peuvent désormais visiter des éléments précédemment ignorés après
+ le compactage d'un tableau.
+ Les pointeurs internes sur des éléments supprimés passent désormais à
+ l'élément survivant suivant lors de la copie sur écriture.
+
+
+
+
+
+ Coalescence sur null et empty sur les propriétés magiques
+
+
+ ?? et empty sur une propriété
+ magique n'appellent plus __get() lorsque
+ __isset() a matérialisé la propriété
+ en écrivant dans la table des propriétés.
+ La valeur fraîchement écrite est retournée directement.
+ isset appliqué directement à la propriété n'est pas
+ affecté ; les formes imbriquées telles que
+ isset($o->p['k']) suivent le même chemin que
+ ??.
+
+
+
+
+$name = 'from __isset()';
+ return true;
+ }
+
+ public function __get(string $name): string
+ {
+ return 'from __get()';
+ }
+}
+
+$example = new Example();
+var_dump($example->foo ?? 'default');
+// À partir de PHP 8.6.0 : string(14) "from __isset()"
+// Avant PHP 8.6.0 : string(12) "from __get()"
+]]>
+
+
+
+
+
+
+ Conversion en chaîne dans array_intersect
+
+
+ array_intersect avec au moins deux tableaux convertit
+ désormais les valeurs en chaînes lors du parcours de ses entrées plutôt que
+ pendant les comparaisons du tri.
+ Cela peut modifier le nombre et l'ordre des avertissements de conversion
+ et des appels à __toString(),
+ l'exception de conversion qui est atteinte, ainsi que le résultat pour les
+ implémentations de __toString() à
+ état.
+ Les types des arguments sont validés avant de vérifier la présence de
+ tableaux vides ou de convertir les valeurs ; un argument ultérieur invalide
+ peut donc supprimer les effets de bord de conversion des tableaux
+ précédents.
+ Les valeurs ne sont pas converties si l'un des tableaux d'entrée est vide.
+
+
+
+
+
+ Saut de page supprimé par défaut
+
+
+ Le saut de page (\f) est désormais ajouté aux
+ caractères supprimés par défaut par trim,
+ rtrim et ltrim.
+
+
+
+
+
+
+
+
+
+
+
+
+ Nouvelles erreurs pour les arguments invalides
+
+
+ Les fonctions suivantes lèvent désormais une
+ ValueError lorsqu'une valeur de drapeau ou
+ de mode invalide est passée :
+
+
+ array_filter (mode)
+ array_change_key_case (case)
+ pathinfo (flags)
+ scandir (sorting_order)
+
+
+
+
+ Les fonctions suivantes lèvent désormais une
+ ValueError lorsque l'argument donné contient
+ des octets NUL :
+
+
+ getenv et putenv (premier argument)
+ dl (extension_filename)
+ openlog (prefix)
+ parse_str (string)
+ proc_open (cwd)
+
+
+
+
+ Les fonctions suivantes lèvent désormais une
+ ValueError pour les valeurs hors limites,
+ au lieu de les plafonner silencieusement ou de les laisser déborder :
+
+
+
+ number_format, lorsque decimals
+ est en dehors de la plage des entiers.
+
+
+ sleep, lorsque seconds est
+ supérieur à UINT_MAX, ou
+ UINT_MAX / 1000 sous Windows.
+
+
+ usleep, lorsque microseconds
+ est supérieur à UINT_MAX.
+
+
+
+
+
+ linkinfo lève désormais une
+ ValueError lorsque l'argument
+ path est vide.
+
+
+
+ setlocale lève désormais une
+ ValueError lorsqu'un nom de locale contient
+ des octets NUL, au lieu de le tronquer silencieusement.
+ Les tableaux ne sont désormais acceptés que pour l'argument
+ locales.
+ Passer un tableau comme argument de locale variadique ultérieur lance
+ désormais une TypeError.
+ Passer des arguments de locale supplémentaires lorsque
+ locales est un tableau lance désormais une
+ ArgumentCountError.
+
+
+
+ Les fonctions suivantes lèvent désormais une
+ ValueError lorsque l'argument
+ filename contient des octets NUL :
+
+
+ fileperms
+ fileinode
+ filesize
+ fileowner
+ filegroup
+ fileatime
+ filemtime
+ filectime
+ filetype
+ is_writable
+ is_readable
+ is_executable
+ is_file
+ is_dir
+ is_link
+ file_exists
+ lstat
+ stat
+
+
+
+
+
+
+ Notice sur la conversion imprécise de nombres
+
+
+ base_convert, bindec,
+ hexdec et octdec émettent
+ désormais une notice lorsqu'elles ne peuvent pas convertir précisément le
+ nombre donné.
+
+
+
+
+
+ Modificateurs d'endianness dans les noms de format de unpack
+
+
+ unpack interprète désormais un <
+ ou un > suivant immédiatement un code de format
+ comme un modificateur d'endianness, et non comme le premier caractère du
+ nom de l'élément.
+ Les formats tels que "s<value" produisent désormais
+ la clé "value" au lieu de
+ "<value", et "C>name" lève une
+ ValueError car le code de format
+ C n'accepte aucun modificateur d'endianness.
+ Un nom commençant par ces caractères n'est pas affecté lorsqu'un
+ répéteur le précède, comme dans "s1<value".
+ Voir aussi les
+ nouveaux
+ modificateurs d'endianness.
+
+
+
+
+
+ 1]
+// Avant PHP 8.6.0 : [" 1]
+]]>
+
+
+
+
+
+
+
+
+ COM
+
+
+ Il n'est plus possible de cloner des objets variant,
+ car le comportement du clonage était mal défini.
+
+
+
+
+
+ cURL
+
+
+ La fonction de rappel enregistrée avec
+ CURLOPT_READFUNCTION lance désormais une
+ ValueError lorsqu'elle retourne un entier
+ autre que 0,
+ CURL_READFUNC_ABORT ou
+ CURL_READFUNC_PAUSE.
+
+
+
+
+
+ DOM
+
+
+ Les propriétés précédemment documentées comme en lecture seule (par ex.
+ DOMNode::$nodeType,
+ DOMDocument::$xmlEncoding,
+ DOMEntity::$actualEncoding,
+ DOMEntity::$encoding,
+ DOMEntity::$version) sont désormais déclarées avec une
+ visibilité
+ asymétrique (public private(set)).
+ Toute tentative d'écriture depuis l'extérieur de la classe lève désormais
+ Cannot modify private(set) property class::$prop from global scope
+ au lieu de l'ancienne erreur de modification d'une propriété en lecture
+ seule.
+ ReflectionProperty::isWritable rapporte également
+ ces propriétés avec exactitude.
+
+
+
+ L'accès par index sur les objets Dom\DtdNamedNodeMap
+ retourne désormais &null; pour les index entiers négatifs au lieu de
+ retourner le premier nœud, et lève une
+ ValueError lorsque l'index entier est
+ supérieur à PHP_INT_MAX au lieu de déborder vers un
+ index plus petit.
+
+
+
+
+
+ FTP
+
+
+ ftp_nb_fget, ftp_nb_fput,
+ ftp_nb_get et ftp_nb_put lancent
+ désormais une Error lorsque la connexion est
+ déjà en cours de transfert, au lieu d'émettre un avertissement et de
+ retourner &false;.
+ ftp_close lance déjà une exception dans la même
+ situation.
+
+
+
+
+
+ GD
+
+
+ imagesetstyle, imagefilter et
+ imagecrop filtrent les types et les valeurs de leurs
+ arguments de type tableau et lèvent en conséquence une
+ TypeError ou une
+ ValueError.
+
+
+
+ imageaffinematrixget impose désormais le type
+ arrayfloat documenté
+ pour le paramètre options, y compris le
+ comportement correspondant du typage faible et strict.
+
+
+
+
+
+ GMP
+
+
+ gmp_fact lève désormais une
+ ValueError si num
+ ne tient pas dans un unsigned long.
+
+
+
+ gmp_pow, gmp_binomial,
+ gmp_root et gmp_rootrem lèvent
+ désormais une ValueError si leur second
+ argument ne tient pas dans un unsigned long.
+
+
+
+ Les opérateurs de décalage (<<,
+ >>) et d'exponentiation (**)
+ sur les objets GMP lèvent désormais une
+ ValueError lorsque les opérandes de droite
+ GMP sont en dehors de la plage des unsigned long, au
+ lieu de les tronquer silencieusement.
+
+
+
+ L'analyse des chaînes d'entiers GMP lève désormais
+ une ValueError pour les chaînes contenant des
+ octets NUL, au lieu de les tronquer silencieusement.
+
+
+
+ Le message de la DivisionByZeroError levée
+ par gmp_powm lors d'un modulo par zéro inclut
+ désormais le nom de la fonction et l'index de l'argument
+ (modulus).
+
+
+
+
+
+ Intl
+
+
+ Passer un objet non stringable comme fuseau horaire aux
+ API Intl qui acceptent des objets ou des chaînes de
+ fuseau horaire lève désormais une TypeError
+ au lieu d'une Error.
+
+
+
+ IntlIterator::current retourne désormais &null;
+ lorsqu'elle est appelée avant que l'itérateur ne soit positionné, ou après
+ que l'itérateur est devenu invalide, au lieu d'exposer une valeur indéfinie.
+
+
+
+ IntlBreakIterator::getLocale lève désormais une
+ ValueError lorsque le type n'est ni
+ Locale::ACTUAL_LOCALE ni
+ Locale::VALID_LOCALE, au lieu de retourner &false;.
+
+
+
+ MessageFormatter::parse et
+ MessageFormatter::parseMessage retournent désormais
+ PHP_INT_MIN sous forme de int, plutôt que
+ de float, sur les plateformes 64 bits lors de l'analyse de
+ valeurs entières.
+
+
+
+ Le paramètre type de
+ IntlBreakIterator::getPartsIterator est passé de
+ string à int pour correspondre à l'implémentation
+ sous-jacente.
+
+
+
+ UConverter::transcode rejette désormais les valeurs
+ d'option from_subst et to_subst de plus
+ de 127 octets, au lieu de tronquer silencieusement la longueur avant de la
+ transmettre à ICU.
+
+
+
+ ResourceBundle::get et
+ resourcebundle_get rapportent désormais les recherches
+ de ressources sans repli avec
+ without fallback to locale
+ au lieu du message mal formé
+ without fallback from to locale.
+
+
+
+ IntlDateFormatter::parse/datefmt_parse
+ et
+ IntlDateFormatter::localtime/datefmt_localtime
+ lèvent désormais une TypeError lorsque
+ l'argument offset n'est pas de type int,
+ au lieu de convertir silencieusement la valeur.
+
+
+
+ Collator::sort,
+ collator_sort,
+ Collator::asort et
+ collator_asort rapportent désormais les échecs de
+ conversion UTF-8/UTF-16 pendant la
+ comparaison via le mécanisme d'erreur d'intl et retournent &false;.
+ Avec intl.use_exceptions
+ activé, ces échecs lancent une IntlException.
+ Auparavant, ces chemins émettaient un avertissement et comparaient la
+ valeur comme une chaîne vide.
+
+
+
+
+
+ MBString
+
+
+ Les tables de données Unicode ont été mises à jour vers Unicode 18.0.
+
+
+
+
+
+ PCNTL
+
+
+ pcntl_alarm lève désormais une
+ ValueError si l'argument
+ seconds est inférieur à zéro ou supérieur à la
+ valeur UINT_MAX de la plateforme.
+
+
+
+ pcntl_exec lève désormais une
+ ValueError si l'argument
+ args n'est pas un tableau de type liste.
+
+
+
+
+
+ PCRE
+
+
+ preg_grep retourne désormais &false; au lieu d'un
+ tableau partiel lorsqu'une erreur d'exécution PCRE se
+ produit (par ex. une entrée UTF-8 malformée avec le
+ modificateur u).
+ Cela est cohérent avec les autres fonctions preg_*.
+
+
+
+
+
+ PGSQL
+
+
+ Lorsque pg_fetch_object reçoit un paramètre
+ constructor_args non vide pour une classe sans
+ constructeur, la ValueError fait désormais
+ référence à l'argument constructor_args au lieu de
+ class.
+ Les erreurs levées lorsque la classe demandée n'est pas instanciable
+ (abstraite, interface, énumération) apparaissent désormais avant la
+ récupération de la ligne.
+
+
+
+
+
+ Phar
+
+
+ Phar::mungServer lève désormais une
+ ValueError lorsqu'une valeur d'argument
+ invalide est passée, au lieu de l'ignorer silencieusement.
+
+
+
+ Phar::addEmptyDir rejette désormais les chemins
+ "/.phar" en plus des chemins ".phar",
+ et lève la même BadMethodCallException pour
+ les tentatives de création du répertoire magique réservé
+ ".phar" par cette forme.
+ Les noms non magiques qui partagent simplement le préfixe
+ ".phar" sont désormais traités comme des répertoires
+ ordinaires.
+
+
+
+ Les fichiers ne sont automatiquement interprétés comme des archives Phar
+ lors de leur inclusion que si ".phar" apparaît comme
+ extension dans la composante nom de fichier de leur chemin.
+ Auparavant, cela pouvait se produire dans un nom de répertoire ou comme
+ partie d'une extension telle que ".pharma".
+
+
+
+
+
+ Session
+
+
+ Définir session.cookie_path,
+ session.cookie_domain ou
+ session.cache_limiter avec
+ une valeur contenant des octets NUL émet désormais un
+ avertissement et laisse le réglage inchangé.
+ Auparavant, les octets NUL étaient silencieusement
+ acceptés : pour cookie_path et
+ cookie_domain, cela amenait la SAPI à
+ abandonner l'en-tête Set-Cookie ; pour
+ cache_limiter, la valeur était silencieusement tronquée
+ à l'octet NUL.
+
+
+
+ session_module_name lance désormais une
+ ValueError si name
+ est une chaîne contenant des octets NUL.
+
+
+
+ session_encode retourne désormais une chaîne vide au
+ lieu de &false; pour les sessions vides.
+ Elle ne retourne désormais &false; que lorsque les données de session n'ont
+ pas pu être encodées.
+ Cela se produit principalement avec le gestionnaire de sérialisation par
+ défaut si une clé contient le caractère pipe (|).
+
+
+
+ Lorsque session.lazy_write
+ est activé et qu'un gestionnaire de session implémente
+ SessionUpdateTimestampHandlerInterface, les
+ sessions qui ont été lues comme vides et restent vides au moment de
+ l'écriture déclenchent désormais
+ SessionUpdateTimestampHandlerInterface::updateTimestamp
+ au lieu de SessionHandlerInterface::write.
+ Auparavant, SessionHandlerInterface::write était
+ toujours appelée pour les sessions vides car
+ session_encode retournait &false;, contournant la
+ comparaison de lazy_write.
+ Les gestionnaires de session personnalisés qui s'appuient sur l'appel de
+ SessionHandlerInterface::write avec des données
+ vides (par ex. pour détruire la session) devraient implémenter la même
+ logique dans leur méthode
+ SessionUpdateTimestampHandlerInterface::updateTimestamp.
+
+
+
+ Les valeurs par défaut de trois réglages INI de session ont changé afin de
+ fournir un comportement sécurisé dès l'installation :
+
+
+
+
+ session.use_strict_mode
+ vaut désormais 1 (auparavant 0).
+ Le mode strict rejette les identifiants de session non initialisés, ce
+ qui atténue la fixation de session.
+ Les gestionnaires de session personnalisés qui s'appuyaient auparavant sur
+ l'acceptation d'identifiants fournis de l'extérieur sans entrée de
+ stockage correspondante doivent soit implémenter
+ SessionUpdateTimestampHandlerInterface::validateId
+ et SessionIdInterface::create_sid, soit
+ définir explicitement ce réglage à 0.
+
+
+ session.cookie_httponly
+ vaut désormais 1 (auparavant 0).
+ Les cookies de session ne sont plus accessibles à JavaScript via
+ document.cookie.
+ Les applications qui lisent le cookie de session depuis JavaScript doivent
+ définir explicitement ce réglage à 0.
+
+
+ session.cookie_samesite
+ vaut désormais "Lax" (auparavant non défini).
+ Les cookies de session ne sont plus envoyés lors des requêtes
+ inter-sites autres que les navigations de premier niveau utilisant des
+ méthodes HTTP sûres.
+ Les applications qui dépendent de l'envoi des cookies de session lors de
+ soumissions POST inter-sites doivent définir explicitement ce réglage à
+ "None" (et définir également
+ session.cookie_secure
+ à 1).
+
+
+
+
+
+ SessionHandler::validateId a été ajoutée et
+ délègue au gestionnaire de sauvegarde configuré.
+ Une sous-classe qui déclare SessionHandler::validateId
+ sans type de retour émet désormais un avertissement de dépréciation pour le
+ type de retour bool provisoire.
+ Une sous-classe qui surcharge SessionHandler::open
+ sans appeler parent::open() conserve son comportement
+ précédent et émet un avertissement lorsqu'un identifiant est validé.
+
+
+
+
+
+ Shmop
+
+
+ shmop_open lève désormais une
+ ValueError lorsque l'argument
+ key est en dehors de la plage key_t
+ de la plateforme, au lieu de transmettre une clé tronquée au système
+ d'exploitation.
+
+
+
+
+
+ SimpleXML
+
+
+ SimpleXMLElement::__construct lève désormais une
+ ValueError lorsque l'argument
+ data contient des octets NUL,
+ comme simplexml_load_file.
+ Avec dataIsURL défini, le chemin était auparavant
+ tronqué au premier octet NUL.
+ Sans lui, la chaîne était transmise à libxml, qui, avec les options par
+ défaut, rejette un NUL sur les versions actuelles mais
+ accepte le document tronqué sur les versions plus anciennes et avec
+ LIBXML_RECOVER.
+
+
+
+
+
+ SOAP
+
+
+ L'option "classmap" de
+ SoapClient et SoapServer
+ rejette désormais les tableaux contenant des clés entières.
+ Auparavant, les tableaux creux à clés entières et les tableaux à clés
+ mixtes pouvaient être acceptés.
+ SoapClient lance désormais une
+ TypeError pour les options
+ "classmap" qui ne sont pas des tableaux et une
+ ValueError pour les tableaux contenant des
+ clés entières, y compris lorsque l'option "exceptions"
+ est désactivée.
+
+
+
+ L'analyse des WSDL/schémas XML rejette
+ désormais les valeurs entières hors limites pour les contraintes
+ d'occurrence et les facettes de restriction entières.
+ Les valeurs négatives de minOccurs et
+ maxOccurs sont également rejetées.
+
+
+
+ Les erreurs d'encodage SOAP rapportent désormais le type concerné ou
+ l'opération défaillante dans le message d'erreur, au lieu du message
+ générique Encoding: Violation of encoding rules.
+ Le code qui compare le message exact peut nécessiter une mise à jour.
+
+
+
+
+
+ Sockets
+
+
+ socket_set_option avec
+ SO_ATTACH_REUSEPORT_CBPF nécessite désormais une
+ value de type int et un
+ level égal à SOL_SOCKET.
+ Tout autre type de valeur lance une TypeError
+ au lieu d'être converti, et tout autre niveau émet un avertissement et
+ retourne &false;.
+
+
+
+ socket_set_option avec
+ SO_ATTACH_REUSEPORT_CBPF et une
+ value égale à 0 détache désormais
+ le filtre reuseport via SO_DETACH_REUSEPORT_BPF.
+ Elle utilisait auparavant SO_DETACH_BPF, un alias de
+ SO_DETACH_FILTER, qui laissait le programme reuseport
+ attaché.
+
+
+
+
+
+ Sodium
+
+
+ Les fonctions de hachage de mots de passe
+ sodium_crypto_pwhash,
+ sodium_crypto_pwhash_str,
+ sodium_crypto_pwhash_scryptsalsa208sha256 et
+ sodium_crypto_pwhash_scryptsalsa208sha256_str lancent
+ désormais une ValueError au lieu d'une
+ SodiumException lorsqu'un argument est hors
+ limites, comme un opslimit ou un
+ memlimit inférieur au minimum documenté.
+ SodiumException est toujours lancée pour les
+ échecs internes de libsodium.
+
+
+
+
+
+ SPL
+
+
+ Les implémentations de SplObjectStorage::getHash
+ ne peuvent plus modifier aucune instance de
+ SplObjectStorage.
+ Toute tentative en ce sens lance désormais une
+ Error.
+
+
+
+ SplFileObject::next fait désormais avancer le flux
+ lorsqu'aucun appel précédent à SplFileObject::current
+ n'a mis une ligne en cache.
+ Un appel ultérieur à SplFileObject::current
+ retourne la nouvelle ligne plutôt que la précédente.
+
+
+
+ SplFileObject::fgets ne met plus en cache la ligne
+ retournée pour les appels ultérieurs à
+ SplFileObject::current.
+ SplFileObject::current relit désormais depuis la
+ position courante du flux au lieu de retourner la ligne que
+ SplFileObject::fgets vient de retourner.
+
+
+
+ SplFileObject::next au-delà de la fin du fichier
+ (EOF) n'incrémente plus
+ SplFileObject::key sans limite.
+ SplFileObject::seek au-delà de
+ EOF produit désormais la même valeur de
+ SplFileObject::key que
+ SplTempFileObject ; les deux retournaient
+ auparavant des valeurs différentes.
+
+
+
+ DirectoryIterator::key retourne désormais
+ intstring, et
+ DirectoryIterator::current retourne
+ stringSplFileInfostatic.
+
+
+
+
+
+ Sysvshm
+
+
+ shm_attach lève désormais une
+ ValueError lorsque l'argument
+ key est en dehors de la plage key_t
+ de la plateforme, au lieu de transmettre une clé tronquée au système
+ d'exploitation.
+
+
+
+
+
+ URI
+
+
+ Uri\WhatWg\Url::__construct définit désormais
+ softErrors à un tableau vide lorsque le traitement
+ de l'URL lance une exception, au lieu de conserver sa valeur.
+ Les erreurs de validation de l'URL restent disponibles dans la propriété
+ Uri\WhatWg\InvalidUrlException::$errors.
+
+
+
+ Uri\WhatWg\Url::__construct,
+ Uri\WhatWg\Url::parse, les méthodes
+ Uri\WhatWg\Url::with*() et
+ Uri\WhatWg\UrlBuilder::build rapportent désormais
+ les erreurs de validation dans l'ordre où elles sont détectées.
+ Cela inverse l'ordre de plusieurs erreurs par rapport à PHP 8.5.
+
+
+
+
+
+ Zip
+
+
+ ZipArchive::extractTo lève désormais une
+ TypeError pour l'argument
+ files si une ou plusieurs des entrées ne sont pas
+ des chaînes.
+
+
+
+ ZipArchive::addGlob et
+ ZipArchive::addPattern lèvent désormais une
+ TypeError lorsque l'option
+ "remove_all_path" n'est pas de type bool,
+ ou lorsque les options "comp_method",
+ "comp_flags" ou "enc_method" ne sont
+ pas de type int (les chaînes numériques sont converties), au
+ lieu d'émettre un avertissement.
+
+
+
+ Sérialiser ou désérialiser une ZipArchive lance
+ désormais une Exception.
+ Une sous-classe peut surcharger
+ __serialize() et
+ __unserialize() pour effectuer un
+ aller-retour via ZipArchive::closeString et
+ ZipArchive::openString.
+
+
+
+
+
+ Zlib
+
+
+ deflate_init lève désormais une
+ TypeError lorsque la valeur de l'option
+ "level", "memory",
+ "window" ou "strategy" n'est pas de
+ type int.
+
+
+
+ inflate_init lève désormais une
+ TypeError lorsque la valeur de l'option
+ "window" n'est pas de type int.
+
+
+
+
+
+
diff --git a/appendices/migration86/new-classes.xml b/appendices/migration86/new-classes.xml
new file mode 100644
index 0000000000..63e4c9b8eb
--- /dev/null
+++ b/appendices/migration86/new-classes.xml
@@ -0,0 +1,106 @@
+
+
+
+ Nouvelles classes et interfaces
+
+
+ Core
+
+ SortDirection
+ StreamError
+ StreamException
+ StreamErrorStore
+ StreamErrorMode
+ StreamErrorCode
+ Io\IoException
+ Io\Poll\Context
+ Io\Poll\Watcher
+ Io\Poll\Backend
+ Io\Poll\Event
+ Io\Poll\Handle
+ Io\Poll\PollException
+ Io\Poll\FailedPollOperationException
+ Io\Poll\FailedContextInitializationException
+ Io\Poll\FailedHandleAddException
+ Io\Poll\FailedWatcherModificationException
+ Io\Poll\FailedPollWaitException
+ Io\Poll\BackendUnavailableException
+ Io\Poll\InactiveWatcherException
+ Io\Poll\HandleAlreadyWatchedException
+ Io\Poll\InvalidHandleException
+ StreamPollHandle
+
+
+
+
+
+
+
+ Date
+
+ Time\Duration
+ Time\TimeException
+
+
+
+
+
+ Intl
+
+ IntlNumberRangeFormatter
+
+
+
+
+ OpenSSL
+
+ Openssl\OpensslException
+ Openssl\Session
+ Openssl\Psk
+
+
+
+
+
+ SNMP
+
+ Snmp\Mib
+ Snmp\OidOutput
+ Snmp\Output
+ Snmp\StringOutput
+
+
+
+
+
+ URI
+
+ Uri\Rfc3986\UriBuilder
+ Uri\WhatWg\UrlBuilder
+ Uri\WhatWg\UrlPercentEncodingMode
+
+
+
+
+
+
+
diff --git a/appendices/migration86/new-features.xml b/appendices/migration86/new-features.xml
new file mode 100644
index 0000000000..fa404ce92e
--- /dev/null
+++ b/appendices/migration86/new-features.xml
@@ -0,0 +1,651 @@
+
+
+
+ Nouvelles fonctionnalités
+
+
+ PHP Core
+
+
+ Valeurs par défaut pour les propriétés en lecture seule
+
+
+ Les propriétés
+ en lecture seule peuvent désormais déclarer des valeurs par défaut.
+
+
+
+
+
+timeout); // int(30)
+]]>
+
+
+
+
+
+
+ Assignation par référence sur WeakMap
+
+
+ Il est désormais possible d'utiliser l'assignation par référence sur une
+ WeakMap sans que la clé n'ait besoin d'être présente
+ au préalable.
+
+
+
+
+
+
+
+
+
+
+
+ __debugInfo sur les énumérations
+
+
+ Il est désormais possible de définir la méthode magique
+ __debugInfo()
+ sur les énumérations.
+ Auparavant, cela provoquait une erreur fatale.
+
+
+
+
+
+ $this->name, 'symbol' => $this->value];
+ }
+}
+
+var_dump(Suit::Hearts);
+]]>
+
+ &example.outputs;
+
+
+ string(6) "Hearts"
+ ["symbol"]=>
+ string(1) "H"
+}
+]]>
+
+
+
+
+
+
+ #[\Override] pour les constantes de classe
+
+
+ L'attribut Override peut désormais être appliqué
+ aux constantes de classe, y compris aux cas d'énumération.
+ Comme pour les méthodes et les propriétés, une erreur de compilation est
+ levée si aucune constante correspondante n'existe dans une classe parente
+ ou une interface implémentée.
+
+
+
+
+
+
+
+
+
+
+
+
+ Application partielle de fonction
+
+
+ Ajout du support de l'application partielle de fonction. Un appel dans
+ lequel un ou plusieurs arguments sont remplacés par le marqueur
+ ?, ou les arguments restants par le marqueur
+ ..., crée une Closure qui
+ accepte les arguments manquants.
+
+
+
+
+
+
+
+
+
+
+
+
+ Modification des objets stockés dans des constantes
+
+
+ Les objets stockés dans des constantes ou des constantes de classe peuvent
+ désormais être modifiés directement via OBJ->prop = $val.
+
+
+
+
+
+debug = true;
+
+var_dump(CONFIG->debug); // bool(true)
+]]>
+
+
+
+
+
+
+ Modificateurs d'endianness pour pack() et unpack()
+
+
+ pack et unpack acceptent
+ désormais les modificateurs < (little-endian) et
+ > (big-endian) après les codes de format d'entiers
+ s, S, l,
+ L, q et Q, ainsi
+ qu'après les codes de format de nombres à virgule flottante
+ f et d.
+
+
+
+
+
+
+', 1)), PHP_EOL; // Affiche "00000001"
+echo bin2hex(pack('l<', 1)), PHP_EOL; // Affiche "01000000"
+echo bin2hex(pack('f>', 1.5)), PHP_EOL; // Affiche "3fc00000"
+
+var_dump(unpack('s>value', "\xff\xfe")); // ["value" => int(-2)]
+]]>
+
+
+
+
+
+
+
+
+ cURL
+
+
+ Le tableau retourné par curl_getinfo inclut désormais
+ une nouvelle clé "size_delivered", qui indique le nombre
+ total d'octets transmis à la fonction de rappel d'écriture du
+ téléchargement.
+ Cette valeur peut également être obtenue en passant
+ CURLINFO_SIZE_DELIVERED comme paramètre
+ option.
+ Nécessite libcurl 8.20.0 ou ultérieur.
+
+
+
+ Ajout de CURLOPT_SEEKFUNCTION pour enregistrer une
+ fonction de rappel qui repositionne le corps d'une requête transmis en flux,
+ afin que libcurl puisse le rembobiner et le renvoyer lors d'une
+ redirection, d'une authentification en plusieurs passes ou d'une nouvelle
+ tentative sur une connexion réutilisée, au lieu d'échouer avec
+ CURLE_SEND_FAIL_REWIND.
+ La fonction de rappel reçoit le CurlHandle, le
+ décalage et l'origine, et doit retourner l'une des valeurs
+ CURL_SEEKFUNC_OK,
+ CURL_SEEKFUNC_FAIL ou
+ CURL_SEEKFUNC_CANTSEEK.
+
+
+
+
+
+ Date
+
+
+ Ajout de la classe Time\Duration.
+
+
+
+
+
+
+ FileInfo
+
+
+ finfo_file fonctionne désormais avec les flux distants.
+
+
+
+
+
+ GMP
+
+
+ Ajout de gmp_powm_sec pour l'exponentiation modulaire
+ résistante aux attaques par canaux auxiliaires.
+ Nécessite GNU MP 5.0.0 ou ultérieur ; indisponible sur les compilations
+ officielles pour Windows utilisant MPIR.
+
+
+
+ Ajout de gmp_prevprime pour obtenir le plus grand
+ nombre premier inférieur au nombre donné.
+ Le paramètre de sortie optionnel definitely_prime
+ indique si le nombre retourné est certainement premier, par opposition à
+ probablement premier.
+ Une ValueError est levée si un tel nombre
+ premier n'existe pas.
+ Cette fonction n'est disponible que lorsque PHP est compilé avec GNU MP
+ 6.3.0 ou ultérieur ; elle n'est pas disponible sur les compilations
+ officielles pour Windows utilisant MPIR.
+
+
+
+
+
+ Intl
+
+
+ Ajout des méthodes statiques
+ IntlDatePatternGenerator::getSkeleton et
+ IntlDatePatternGenerator::getBaseSkeleton pour
+ générer le squelette unique et le squelette de base d'un motif de
+ date/heure.
+
+
+
+ Ajout de Locale::getDisplayKeyword et
+ Locale::getDisplayKeywordValue, avec les alias
+ locale_get_display_keyword et
+ locale_get_display_keyword_value, respectivement.
+
+
+
+
+ Ajout de la classe IntlNumberRangeFormatter pour
+ formater un intervalle de deux nombres avec un squelette et une locale
+ donnés.
+ Elle est prise en charge à partir de ICU 63.
+ Le comportement de regroupement est l'un des suivants :
+
+ IntlNumberRangeFormatter::COLLAPSE_AUTO
+ IntlNumberRangeFormatter::COLLAPSE_NONE
+ IntlNumberRangeFormatter::COLLAPSE_UNIT
+ IntlNumberRangeFormatter::COLLAPSE_ALL
+
+ Le comportement de repli en cas d'identité est l'un des suivants :
+
+ IntlNumberRangeFormatter::IDENTITY_FALLBACK_SINGLE_VALUE
+ IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE
+ IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY
+ IntlNumberRangeFormatter::IDENTITY_FALLBACK_RANGE
+
+
+
+
+ Ajout de SpoofChecker::areBidiConfusable pour
+ vérifier si deux chaînes sont confondables pour une direction de texte
+ donnée, ainsi que des constantes de direction
+ SpoofChecker::LTR et
+ SpoofChecker::RTL.
+ Elle est prise en charge à partir de ICU 74.
+
+
+
+ Ajout de SpoofChecker::getBidiSkeleton pour
+ générer un squelette de confusion pour une direction de texte donnée.
+ Elle est prise en charge à partir de ICU 74.
+
+
+
+ Ajout de SpoofChecker::getSkeleton pour générer un
+ squelette de confusion pour une chaîne donnée.
+
+
+
+
+
+ IO
+
+
+ Ajout d'une nouvelle API de scrutation (polling),
+ composée de :
+
+ Les classes Io\Poll\Context et Io\Poll\Watcher
+ Les énumérations Io\Poll\Backend et Io\Poll\Event
+ L'interface Io\Poll\Handle
+ La classe StreamPollHandle pour surveiller les flux
+
+
+
+
+
+
+
+ JSON
+
+
+ Ajout d'informations supplémentaires sur l'emplacement de l'erreur dans les
+ messages d'erreur retournés par json_last_error_msg et
+ dans le message de JsonException.
+
+
+
+
+
+ OpenSSL
+
+
+ Ajout du support de la reprise de session TLS pour les
+ flux.
+ Cela permet de sauvegarder et de restaurer des sessions client entre les
+ requêtes, d'implémenter un stockage de session personnalisé côté serveur et
+ de contrôler le comportement du cache de sessions, à l'aide des nouvelles
+ options de contexte SSL suivantes :
+
+ session_data
+ session_new_cb
+ session_cache
+ session_cache_size
+ session_timeout
+ session_id_context
+ session_get_cb
+ session_remove_cb
+ num_tickets
+
+
+
+
+
+ Ajout du support des clés pré-partagées (PSK) externes
+ TLS pour les flux, avec les nouvelles options de
+ contexte SSL
+ psk_client_cb et psk_server_cb.
+ Cela permet de définir et de recevoir des clés pré-partagées.
+
+
+
+ Ajout du support des données anticipées (0-RTT) de TLS
+ 1.3 pour les flux.
+ Les clients envoient des données anticipées avec l'option de
+ contexte SSL
+ early_data ; les serveurs les acceptent avec
+ max_early_data et les reçoivent via la fonction de rappel
+ early_data_cb.
+ Le résultat est indiqué par "accepted",
+ "rejected" ou "not_sent" dans la clé
+ "early_data" de l'entrée "crypto" du
+ tableau retourné par stream_get_meta_data.
+
+
+
+
+
+ PDO_PGSQL
+
+
+ Ajout de Pdo\Pgsql::ATTR_CHUNK_SIZE, le nombre de
+ lignes qu'une requête récupère par bloc.
+ Une valeur de 1 ou plus active le mode de récupération paresseuse de
+ PDO::ATTR_PREFETCH => 0.
+ Définir PDO::ATTR_PREFETCH remplace la taille de bloc.
+ Les requêtes préparées sans cette option ni
+ PDO::ATTR_PREFETCH reprennent la valeur définie sur la
+ connexion.
+ Nécessite libpq 17 ou ultérieur.
+
+
+
+
+
+ Phar
+
+
+ La surcharge des méthodes SplFileInfo::getMTime et
+ SplFileInfo::getPathname influence désormais le
+ résultat des familles de méthodes
+ Phar::buildFromDirectory et
+ Phar::buildFromIterator.
+ Cela permet de redéfinir l'horodatage et les noms des fichiers.
+
+
+
+
+
+ SNMP
+
+
+ Il est désormais possible d'utiliser AES192,
+ AES192C, AES256 et
+ AES256C comme protocoles de sécurité SNMPv3 si la
+ bibliothèque sous-jacente les prend en charge.
+
+
+
+
+ Il est désormais possible de réinitialiser l'arbre MIB
+ avec la nouvelle fonction snmp_init_mib.
+
+
+
+
+ Des fonctionnalités supplémentaires de contrôle de l'analyse des
+ MIB et de la sortie sont exposées via :
+
+ snmp_set_mib_option
+ snmp_set_output_option
+ snmp_set_string_output_format
+ SNMP::$numeric_index
+ SNMP::$numeric_timeticks
+ SNMP::$extended_index
+ SNMP::$dont_print_units
+ SNMP::$escape_quotes
+ SNMP::$print_hex_text
+ SNMP::setOidOutputFormat
+ SNMP::setStringOutputFormat
+
+
+
+
+
+
+
+ Flux
+
+
+ Ajout d'une nouvelle API d'erreurs de flux, composée de :
+
+ Les classes StreamError et StreamException
+ Les énumérations StreamErrorStore, StreamErrorMode et StreamErrorCode
+ Les fonctions stream_last_errors et stream_clear_errors
+
+ Elle est contrôlée à l'aide des options de contexte de flux
+ error_mode, error_store et
+ error_handler.
+
+
+
+
+ Ajout de l'option de contexte de flux filter.max_filter_count
+ pour les URL php://filter.
+ Lorsqu'elle est définie, l'ouverture du flux échoue avec un avertissement si
+ l'URL ajoutait plus de filtres que la valeur configurée.
+ Les valeurs négatives désactivent la vérification.
+
+
+
+
+ Ajout de l'option de contexte de socket
+ so_reuseaddr qui permet de désactiver la réutilisation
+ d'adresse (SO_REUSEADDR) et utilise explicitement
+ SO_EXCLUSIVEADDRUSE sous Windows.
+
+
+
+ Ajout des options de contexte de socket
+ so_keepalive, tcp_keepidle,
+ tcp_keepintvl et tcp_keepcnt qui
+ permettent de définir les options de keepalive des sockets.
+
+
+
+ Ajout de l'option de contexte de socket
+ so_linger qui définit SO_LINGER sur
+ les sockets TCP.
+ Une valeur positive active l'attente de fermeture pendant ce nombre de
+ secondes, zéro ou une valeur négative la désactive.
+ Les valeurs supérieures à 65535 sont plafonnées, car sur certaines
+ plateformes la durée de linger est limitée à un entier court non signé.
+
+
+
+ Ajout des options de contexte de socket
+ so_rcvbuf et so_sndbuf qui définissent
+ les tailles des tampons de réception et d'envoi du socket, en octets
+ (SO_RCVBUF et SO_SNDBUF), sur les
+ sockets TCP et UDP.
+ La valeur doit être un entier compris entre 1 et 2147483647 ; toute autre
+ valeur fait échouer la création du flux.
+ Le système d'exploitation peut arrondir, plafonner ou ajuster autrement la
+ taille demandée, et peut cesser de dimensionner ce tampon automatiquement ;
+ la taille relue peut donc différer de celle demandée.
+
+
+
+ Les flux filtrés peuvent désormais être convertis en descripteurs de
+ fichier, pour une utilisation avec stream_select.
+
+
+
+ Ajout du paramètre de filtre "write_seek_mode" pour les
+ filtres de flux bz2, iconv, zlib et
+ convert.
+ Ce paramètre doit être défini via un tableau associatif dont la clé est
+ "write_seek_mode" et dont la valeur est l'une des
+ chaînes suivantes :
+
+ "preserve"
+ "reset"
+ "strict"
+
+
+
+
+
+
+ URI
+
+
+ Ajout de Uri\Rfc3986\Uri::getUriType et
+ Uri\WhatWg\Url::isSpecialScheme.
+
+
+
+
+ Ajout de Uri\Rfc3986\Uri::getHostType et
+ Uri\WhatWg\Url::getHostType.
+
+
+
+
+ Ajout des classes Uri\Rfc3986\UriBuilder et
+ Uri\WhatWg\UrlBuilder.
+
+
+
+
+ Ajout de Uri\WhatWg\url_percent_encode.
+
+
+
+
+
+
+
diff --git a/appendices/migration86/new-functions.xml b/appendices/migration86/new-functions.xml
new file mode 100644
index 0000000000..4ab02d7fa5
--- /dev/null
+++ b/appendices/migration86/new-functions.xml
@@ -0,0 +1,233 @@
+
+
+
+ Nouvelles fonctions
+
+
+ Core
+
+
+
+
+ clamp retourne la valeur donnée si elle est dans
+ l'intervalle, sinon retourne la borne la plus proche.
+
+
+ stream_last_errors
+ stream_clear_errors
+ stream_socket_get_crypto_status
+
+
+
+
+ GMP
+
+
+ gmp_powm_sec
+ gmp_prevprime
+
+
+
+
+ Intl
+
+
+
+ grapheme_strrev
+
+ IntlDatePatternGenerator::getSkeleton
+
+
+ IntlDatePatternGenerator::getBaseSkeleton
+
+
+
+ Locale::getDisplayKeyword
+
+ locale_get_display_keyword
+
+ Locale::getDisplayKeywordValue
+
+ locale_get_display_keyword_value
+
+ SpoofChecker::areBidiConfusable
+
+
+ SpoofChecker::getBidiSkeleton
+
+
+ SpoofChecker::getSkeleton
+
+
+
+
+
+ MySQLi
+
+
+
+
+ mysqli::quote_string
+
+ mysqli_quote_string
+
+
+
+
+ Reflection
+
+
+
+ ReflectionAttribute::inNamespace
+
+
+ ReflectionAttribute::getNamespaceName
+
+
+ ReflectionAttribute::getShortName
+
+
+ ReflectionConstant::inNamespace
+
+
+
+ ReflectionParameter::getDocComment
+
+
+
+ ReflectionProperty::isReadable
+
+
+ ReflectionProperty::isWritable
+
+
+
+
+
+ SNMP
+
+
+
+ snmp_init_mib
+ snmp_set_mib_option
+ snmp_set_output_option
+ snmp_set_string_output_format
+
+ SNMP::setOidOutputFormat
+
+
+ SNMP::setStringOutputFormat
+
+
+
+
+
+ Sodium
+
+
+ sodium_crypto_ipcrypt_keygen
+ sodium_crypto_ipcrypt_encrypt
+ sodium_crypto_ipcrypt_decrypt
+ sodium_crypto_ipcrypt_nd_keygen
+ sodium_crypto_ipcrypt_nd_encrypt
+ sodium_crypto_ipcrypt_nd_decrypt
+ sodium_crypto_ipcrypt_ndx_keygen
+ sodium_crypto_ipcrypt_ndx_encrypt
+ sodium_crypto_ipcrypt_ndx_decrypt
+ sodium_crypto_ipcrypt_pfx_keygen
+ sodium_crypto_ipcrypt_pfx_encrypt
+ sodium_crypto_ipcrypt_pfx_decrypt
+ sodium_bin2ip
+ sodium_ip2bin
+
+
+
+ Les fonctions suivantes exposent le KEM X-Wing
+ (hybride ML-KEM768+X25519, le KEM recommandé par libsodium).
+ Elles sont disponibles lorsque PHP est compilé avec libsodium 1.0.22 ou
+ ultérieur.
+
+
+ sodium_crypto_kem_keypair
+ sodium_crypto_kem_seed_keypair
+ sodium_crypto_kem_secretkey
+ sodium_crypto_kem_publickey
+ sodium_crypto_kem_enc
+ sodium_crypto_kem_dec
+
+
+
+
+ Les fonctions suivantes exposent le KEM ML-KEM768
+ (FIPS 203).
+ Elles sont disponibles lorsque PHP est compilé avec libsodium 1.0.22 ou
+ ultérieur.
+
+
+ sodium_crypto_kem_mlkem768_keypair
+ sodium_crypto_kem_mlkem768_seed_keypair
+ sodium_crypto_kem_mlkem768_secretkey
+ sodium_crypto_kem_mlkem768_publickey
+ sodium_crypto_kem_mlkem768_enc
+ sodium_crypto_kem_mlkem768_dec
+
+
+
+
+
+ URI
+
+
+
+
+ Uri\Rfc3986\Uri::getUriType
+
+
+ Uri\WhatWg\Url::isSpecialScheme
+
+
+
+ Uri\Rfc3986\Uri::getHostType
+
+
+ Uri\WhatWg\Url::getHostType
+
+
+ Uri\WhatWg\url_percent_encode
+
+
+
+
+ Zip
+
+
+
+ ZipArchive::openString
+
+
+ ZipArchive::closeString
+
+
+
+
+
+
diff --git a/appendices/migration86/other-changes.xml b/appendices/migration86/other-changes.xml
new file mode 100644
index 0000000000..b9f2df79e2
--- /dev/null
+++ b/appendices/migration86/other-changes.xml
@@ -0,0 +1,599 @@
+
+
+
+ Autres changements
+
+
+ Changements du cœur
+
+
+ Core
+
+
+ En cas de condition OOM (mémoire insuffisante) fatale,
+ PHP appelle désormais abort() au lieu de
+ exit(1), ce qui change le code de sortie en 134 et peut
+ créer un core dump.
+
+
+
+ La constante PHP_OS_FAMILY a une valeur
+ AIX lors de l'exécution sur AIX ou IBM i via PASE.
+
+
+
+
+
+
+
+ Changements dans les modules SAPI
+
+
+ CLI
+
+
+ Le serveur de développement
+ intégré accepte désormais les requêtes utilisant la méthode
+ HTTP QUERY au lieu de retourner
+ 501 Not Implemented.
+
+
+
+ Le serveur de développement
+ intégré ne reflète plus l'en-tête Host des
+ requêtes.
+
+
+
+
+
+
+
+ Fonctions modifiées
+
+
+ Core
+
+
+ header_register_callback déclare désormais
+ true comme type de retour.
+ Elle ne peut plus retourner &false; à partir de PHP 8.0.0, date à laquelle le
+ passage d'une fonction de rappel invalide a commencé à lancer une
+ TypeError.
+
+
+
+ register_tick_function déclare désormais
+ true comme type de retour.
+ Elle a toujours retourné &true; en cas de succès ; une fonction de rappel
+ invalide lance une TypeError lors de
+ l'analyse des arguments, avant que le corps de la fonction ne soit
+ atteint.
+
+
+
+ ini_get_all inclut désormais un élément
+ "builtin_default_value" pour chaque directive lorsque
+ details vaut &true;.
+ Il contient la valeur par défaut intégrée de la directive (ou &null; si
+ elle n'en a pas), indépendamment des valeurs définies dans &php.ini;, en
+ ligne de commande ou à l'exécution.
+
+
+
+ fclose, file_put_contents et
+ copy retournent désormais &false; lorsque le vidage
+ ou la fermeture du flux échoue.
+ Auparavant, de tels échecs étaient silencieusement ignorés.
+
+
+
+
+
+ Date
+
+
+ Les méthodes suivantes ont désormais des types de retour provisoires
+ static :
+
+
+ DateTime::createFromInterface
+ DateTimeImmutable::__set_state
+ DateTimeImmutable::modify
+ DateTimeImmutable::add
+ DateTimeImmutable::sub
+ DateTimeImmutable::setTimezone
+ DateTimeImmutable::setTime
+ DateTimeImmutable::setDate
+ DateTimeImmutable::setISODate
+ DateTimeImmutable::setTimestamp
+ DateTimeImmutable::createFromInterface
+ DateTimeZone::__set_state
+ DateInterval::__set_state
+ DatePeriod::__set_state
+
+
+
+
+
+
+ Filter
+
+
+ Le type de retour de filter_var_array a été restreint
+ de
+ arrayfalsenull
+ à arrayfalse.
+ La fonction établit toujours un tableau avant de filtrer, &null; n'était
+ donc jamais retourné.
+ filter_input_array n'est pas affectée : elle retourne
+ toujours &null; lorsque la superglobale demandée n'existe pas.
+
+
+
+
+
+ LDAP
+
+
+ Le type de retour de ldap_free_result a été restreint
+ de bool à true.
+ La fonction retournait déjà toujours &true;.
+
+
+
+
+
+ MySQLi
+
+
+ La structure retournée par mysqli_get_charset ne
+ contient plus l'élément non documenté "comment".
+ La valeur de "charsetnr" est désormais fixée à la
+ constante 0, car ce numéro était un détail
+ d'implémentation qui n'aurait pas dû être exposé publiquement.
+
+
+
+
+
+ OpenSSL
+
+
+ La sortie de openssl_x509_parse contient désormais
+ une entrée "criticalExtensions" listant toutes les
+ extensions critiques du certificat.
+
+
+
+ openssl_sign et openssl_verify
+ ont désormais un argument optionnel supplémentaire
+ salt_length qui permet de contrôler la longueur du
+ sel RSA-PSS lorsque
+ OPENSSL_PKCS1_PSS_PADDING est utilisé.
+ Il accepte une longueur explicite ou l'une des nouvelles constantes
+ OPENSSL_RSA_PSS_SALTLEN_*.
+
+
+
+
+
+ PDO_DBLIB
+
+
+ Lors de l'utilisation de connexions persistantes, une vérification de
+ disponibilité de la connexion est désormais effectuée dans
+ PDO::__construct.
+
+
+
+
+
+ Phar
+
+
+ Phar::mungServer prend désormais en charge les
+ valeurs par référence.
+
+
+
+
+
+ Readline
+
+
+ readline_completion_function déclare désormais
+ true comme type de retour.
+ Elle a toujours retourné &true; en cas de succès ; une fonction de rappel
+ invalide lance une TypeError lors de
+ l'analyse des arguments, avant que le corps de la fonction ne soit
+ atteint.
+
+
+
+
+
+ Reflection
+
+
+ Les sorties de
+ ReflectionClassConstant::__toString et de
+ ReflectionConstant::__toString affichent
+ désormais les valeurs de constantes bool sous la forme
+ true et false plutôt que
+ 1 et une chaîne vide.
+ Cela affecte également d'autres façons d'afficher les constantes de
+ classe, par ex. ReflectionClass::__toString.
+
+
+
+
+
+ Sockets
+
+
+ socket_addrinfo_lookup a désormais un argument
+ optionnel supplémentaire error_code qui, lorsqu'il
+ n'est pas &null;, reçoit le code d'erreur en cas d'échec (l'une des
+ constantes EAI_*).
+
+
+
+ Le type de retour de socket_cmsg_space a été restreint
+ de intnull à
+ int.
+ Tous les chemins d'échec lancent une
+ ValueError à partir de PHP 8.0.0, &null; n'était
+ donc jamais retourné.
+
+
+
+
+
+ Zip
+
+
+ Le type de retour de zip_entry_close a été restreint
+ de bool à true.
+ La fonction retournait déjà toujours &true;.
+
+
+
+
+
+
+
+ Autres changements aux extensions
+
+
+ Fileinfo
+
+
+ Mise à jour vers file 5.48.
+ Les bases de données magic compilées sur mesure avec d'anciennes versions
+ de file doivent être régénérées.
+
+
+
+
+
+ Hash
+
+
+ La version intégrée de xxHash a été mise à jour vers 0.8.2.
+
+
+
+
+
+ MySQLi
+
+
+ Ajout de la nouvelle constante MYSQLI_OPT_COMPRESS.
+
+
+
+
+
+ Opcache
+
+
+ Le JIT est désormais pris en charge pour les
+ compilations ZTS sur Apple Silicon.
+
+
+
+
+
+
+
+ Changements dans la gestion des fichiers INI
+
+
+ Core
+
+
+ L'option INI error_include_args
+ a été ajoutée pour rendre cohérent l'affichage des arguments de fonction
+ dans les erreurs ; elle est désactivée par défaut.
+ Auparavant, le fait qu'une fonction affiche un paramètre dans l'erreur
+ dépendait de chaque appel à la fonction d'erreur interne.
+ Désormais, tous les paramètres tels qu'ils ont réellement été passés à la
+ fonction seront affichés.
+ Cela utilise la même infrastructure que les traces d'appels : les
+ paramètres sensibles ne seront donc pas affichés, et les chaînes seront
+ tronquées selon
+ zend.exception_string_param_max_len.
+
+
+
+
+
+
+ MBString
+
+
+ La directive INI
+ mbstring.detect_order
+ met désormais à jour l'ordre de détection interne lorsqu'elle est modifiée
+ à l'exécution via ini_set.
+ Auparavant, les modifications à l'exécution avec
+ ini_set n'avaient aucun effet sur
+ mb_detect_order.
+ Définir la directive à &null; ou à une chaîne vide à l'exécution laisse
+ désormais inchangé l'ordre de détection précédemment configuré.
+
+
+
+
+
+ MySQLi
+
+
+ mysqli.default_port vérifie
+ désormais la validité de la valeur, qui doit être comprise entre
+ 0 et 65535 inclus.
+
+
+
+
+
+ Opcache
+
+
+ opcache.jit_debug accepte un
+ nouveau drapeau : ZEND_JIT_DEBUG_TRACE_EXIT_INFO_SRC.
+ Lorsqu'il est utilisé avec ZEND_JIT_DEBUG_TRACE_EXIT_INFO,
+ la source des points de sortie est affichée dans les informations de
+ sortie, dans les compilations de débogage.
+
+
+
+
+
+
+
+ Performance
+
+
+ Core
+
+
+ printf n'utilisant que %s et
+ %d sera compilée en l'interpolation de chaîne
+ équivalente, évitant le coût d'un appel de fonction et l'analyse répétée de
+ la chaîne de format.
+
+
+
+ Les arguments sont désormais passés plus efficacement aux constructeurs
+ connus (par ex. lors de l'utilisation de new self()).
+
+
+
+ array_map utilisant comme fonction de rappel un
+ callable de première
+ classe ou une
+ application
+ partielle de fonction sera compilée en la boucle
+ foreach équivalente,
+ évitant la création de Closure intermédiaires et le
+ coût de l'appel de fonctions de rappel utilisateur depuis des fonctions
+ internes, et offrant une meilleure visibilité au JIT.
+
+
+
+ Les performances de la VM TAILCALL ont été améliorées,
+ et elle est désormais activée sous Windows lors de la compilation avec
+ Clang 19 ou ultérieur sur x86_64.
+
+
+
+ Les performances des compilations ZTS ont été
+ améliorées.
+
+
+
+ Ajout d'un cache de fermetures sans état.
+
+
+
+
+ Le code profondément récursif qui amène la VM à allouer de nouvelles pages
+ de pile devrait désormais être plus rapide.
+
+
+
+ Amélioration des performances du tri des tableaux à un seul élément.
+
+
+
+ Amélioration des performances des fonctions suivantes :
+
+
+ addcslashes, lors de la génération d'échappements octaux
+ array_fill_keys
+ array_intersect
+ array_map, avec plusieurs tableaux passés
+ array_product et array_sum, pour les tableaux ne contenant que des entiers
+ array_unshift
+ array_walk
+ intval, pour intval('0b...', 2) et intval('+0b...', 2)
+ pathinfo, lorsqu'un seul composant est demandé
+ str_pad
+ str_repeat, lorsque le multiplicateur vaut 1
+ str_split
+
+
+
+
+
+
+ DOM
+
+
+ DOMText::splitText et
+ Dom\Text::splitText sont plus rapides et
+ consomment moins de mémoire.
+
+
+
+
+
+ GD
+
+
+ imagebmp, imagewbmp,
+ imagegd et imagegd2 mettent
+ désormais la sortie en tampon lors de l'écriture vers des flux PHP, ce qui
+ améliore significativement les performances d'écriture des images dans des
+ fichiers.
+
+
+
+ Amélioration des performances de imagegrabscreen et
+ imagegrabwindow sous Windows.
+
+
+
+
+
+ Intl
+
+
+ Amélioration des performances de
+ IntlCalendar::getAvailableLocales et de
+ IntlDateFormatter::localtime/datefmt_localtime
+ grâce à la préallocation des tableaux qu'elles retournent.
+
+
+
+ Amélioration des performances de
+ transliterator_list_ids et de
+ resourcebundle_locales grâce à la préallocation des
+ tableaux qu'elles retournent.
+
+
+
+ Optimisation de l'appel de la fonction de rappel dans
+ IntlChar::enumCharTypes.
+
+
+
+
+
+ JSON
+
+
+ Amélioration des performances de l'encodage des tableaux et des objets.
+
+
+
+ Amélioration des performances de la génération de l'indentation dans
+ json_encode lors de l'utilisation de
+ JSON_PRETTY_PRINT.
+
+
+
+
+
+ MBString
+
+
+ Amélioration des performances de mb_str_pad.
+
+
+
+
+
+ Phar
+
+
+ Réduction des allocations temporaires lors de l'itération sur les
+ répertoires Phar.
+
+
+
+
+
+ URI
+
+
+ Amélioration des performances de
+ Uri\WhatWg\Url::parse lors de la collecte des
+ erreurs de validation grâce à la préallocation du tableau d'erreurs.
+
+
+
+ Réduction des allocations lors de la lecture des hôtes IPv6/IPvFuture et
+ des chemins avec Uri\Rfc3986\Uri.
+
+
+
+ Amélioration des performances et de la consommation de mémoire lors de
+ l'utilisation des accesseurs normalisants (non bruts) sur des URI déjà
+ normalisées avec Uri\Rfc3986\Uri.
+
+
+
+
+
+ Zip
+
+
+ Amélioration des performances de
+ ZipArchive::addGlob et de
+ ZipArchive::addPattern grâce à la préallocation
+ des tableaux qu'elles retournent.
+
+
+
+ Les copies de chaînes sont évitées dans
+ ZipArchive::addFromString.
+
+
+
+
+
+
+
+
diff --git a/appendices/migration86/windows-support.xml b/appendices/migration86/windows-support.xml
new file mode 100644
index 0000000000..2999421f1d
--- /dev/null
+++ b/appendices/migration86/windows-support.xml
@@ -0,0 +1,59 @@
+
+
+
+ Support de Windows
+
+
+ Core
+
+
+ Les compilations officielles pour Windows utilisent désormais Visual Studio 2026 (VS18).
+
+
+
+
+
+ LibXML
+
+
+ La bibliothèque libxml2 utilisée par les compilations officielles pour
+ Windows a été mise à jour vers la version 2.15.3.
+ En conséquence, DOMDocument::$documentURI pour les
+ documents chargés depuis un fichier local contient désormais un chemin
+ natif du système de fichiers au lieu d'une URI de
+ fichier.
+
+
+
+
+
+ OpenSSL
+
+
+ La bibliothèque OpenSSL utilisée par les compilations officielles pour
+ Windows a été mise à jour vers OpenSSL 4.
+
+
+
+
+
+