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.
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.
<?php
function getConfig(): array
{
try {
return loadConfig(); // lance une exception si le fichier est absent
} finally {
return []; // Déprécié : l'exception disparaît, l'appelant obtient simplement []
}
}
Déclarer un type de retour
?array 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 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é.
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.
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.
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.
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.
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.
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 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.
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 :
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 :
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.
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.
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 :
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.
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.
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.
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.
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.
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.
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.