PHP 8.6.0 RC3 available for testing

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.

<?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 []
    }
}

Type de retour nullable pour __debugInfo()

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 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 :

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 :

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 :

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.

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.

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.

+add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top