Declarar una constante de clase
llamada namespace ahora está obsoleto.
namespace es una palabra clave semirreservada, y el
nombre se reserva para una posible sintaxis futura, como una
pseudoconstante ::namespace análoga a
::class.
Los métodos y las propiedades estáticas llamados namespace
no se ven afectados.
Renombre la constante, por ejemplo a NAMESPACE_NAME.
Utilizar la sentencia return dentro de un bloque finally
ahora está obsoleto, y emite un aviso de obsolescencia en tiempo de
compilación.
Un return de este tipo descarta silenciosamente una
excepción lanzada por el bloque try o
catch asociado, o sobrescribe el valor que este
devuelve, de modo que los fallos desaparecen sin dejar rastro.
Mueva el return fuera del bloque
finally; el mismo resultado siempre puede expresarse sin
él.
<?php
function getConfig(): array
{
try {
return loadConfig(); // lanza una excepción si el fichero no existe
} finally {
return []; // Obsoleto: la excepción desaparece, el llamador simplemente obtiene []
}
}
Declarar un tipo de retorno
?array para
__debugInfo() ahora
está obsoleto.
Devolver null desde este método ya estaba
obsoleto
en PHP 8.5, por lo que el tipo de retorno nullable ya no describe un
comportamiento válido.
Declare array en su lugar.
Devolver un valor desde
__construct() o
__destruct() ahora
está obsoleto, y emite un aviso de obsolescencia en tiempo de compilación.
Estos métodos no pueden declarar un tipo de retorno, y su valor de retorno
nunca puede observarse en un uso normal, lo que hacía que devolver un valor
resultara, como mínimo, confuso.
Utilizar return; sin valor para omitir el resto de la
lógica sigue estando permitido, al igual que llamar manualmente a estos
métodos.
Por la misma razón, utilizar yield para convertir
__construct() o
__destruct() en un
generador ahora está obsoleto.
Declarar una función llamada readonly ahora está
obsoleto.
readonly
es una palabra clave reservada; en PHP 8.1 se añadió una excepción en el
analizador léxico únicamente para mantener en funcionamiento una función
existente de WordPress con ese nombre, y ninguna otra palabra clave de PHP
recibe un tratamiento especial de este tipo.
Renombre la función.
Utilizar let o is como nombre de
clase, interfaz, trait, enumeración, función o constante (incluso mediante
define()) ahora está obsoleto, al igual que utilizar
cualquiera de ellos como alias en una llamada a
class_alias() o en una declaración
use, use function o
use const.
Los nombres se reservan como palabras clave para posibles funcionalidades
futuras: let para el ámbito de bloque e
is para la coincidencia de patrones.
Renombre los símbolos afectados.
La
obsolescencia
de _ como nombre de clase en PHP 8.4 se extiende
a las constantes: declarar una constante llamada _ con
const o define(), y utilizar
_ como alias de una clase o de una constante en una
declaración use, ahora están obsoletos.
Las funciones llamadas _, incluido el alias
_() de gettext(), no se ven
afectadas.
Pasar el argumento case_insensitive a
define() ahora está obsoleto.
Las constantes insensibles a mayúsculas y minúsculas se eliminaron en
PHP 8.0, y desde entonces el argumento se ignora.
Pasar explícitamente false ahora emite un aviso de obsolescencia.
Pasar true sigue emitiendo una advertencia, cuyo mensaje ahora indica que
esto pasará a ser un error en PHP 9.0.
Omita el argumento.
Llamar a is_a() o is_subclass_of()
con un string como primer argumento mientras
allow_string es false ahora está obsoleto.
En ese caso las funciones siempre devuelven false, incluso cuando la
clase ya está cargada, por lo que una llamada de este tipo indica un error.
Para evitar activar la carga automática, compruebe primero con
class_exists() con la carga automática desactivada, y
luego llame a la función con allow_string
establecido en true.
La función metaphone() ahora está obsoleta. Implementa el algoritmo Metaphone original de 1990, que se limita a las reglas de pronunciación del inglés y hace tiempo que fue superado por Double Metaphone y Metaphone 3. Los algoritmos fonéticos son específicos de cada idioma y se actualizan con frecuencia, por lo que se atienden mejor con una biblioteca en espacio de usuario; utilice una en su lugar.
Utilizar más de 16 filtros en una URL
php://filter sin configurar la opción
de contexto de flujo filter.max_filter_count ahora emite
un aviso de obsolescencia.
Las cadenas de filtros largas no tienen ningún uso legítimo conocido, pero
son la base de una clase de ataques que convierten una inclusión de fichero
local o una lectura arbitraria de ficheros en ejecución remota de código.
Cuando filter.max_filter_count se define explícitamente,
superarlo ya es un error: la apertura del flujo falla con una advertencia.
El código que necesite más filtros debería añadirlos con stream_filter_append() o stream_filter_prepend(), que no tienen límite, o bien aumentar el límite mediante la opción de contexto, por ejemplo de forma global con stream_context_set_default().
Pasar un objeto como argumento array a
array_walk() o
array_walk_recursive() ahora está obsoleto.
Un pequeño número de funciones interpretan silenciosamente un objeto como
el array de sus propiedades visibles.
Modificar esas propiedades mediante una función de retrollamada por
referencia viola la semántica de
readonly
y puede corromper los casos de enumeración, y
array_walk_recursive() de todos modos no desciende a los
objetos anidados.
Llame primero a get_object_vars() sobre el objeto y pase
el array resultante.
Pasar un objeto como argumento data a
http_build_query() ahora está obsoleto.
Los objetos encontrados como valores dentro de data
ahora también emiten un aviso de obsolescencia cuando se interpretan como
arrays.
Tratar los objetos como arrays ha sido una fuente recurrente de confusión,
en particular para los objetos Stringable,
que los usuarios esperan que se conviertan en string.
Convierta los objetos en arrays con get_object_vars(),
de forma recursiva si es necesario, antes de llamar a la función.
Tras la obsolescencia de los nombres de conversión no canónicos en PHP 8.5, los alias de funciones que llevan esos mismos nombres de tipo anticuados ahora están obsoletos. Se comportan de forma idéntica a sus equivalentes canónicos, que deben utilizarse en su lugar:
La función strcoll() ahora está obsoleta.
Compara strings según el ajuste LC_COLLATE de la
configuración regional actual, que es un estado global del proceso definido
mediante setlocale() y que cualquier biblioteca puede
cambiar; no es segura con datos binarios, a diferencia del resto de
funciones de comparación de strings, y algunas configuraciones regionales
no implementan reglas de ordenación correctas.
Utilice en su lugar Collator::compare() de la
extensión intl, que es precisa y dispone
de reglas de ordenación actualizadas.
La bandera SORT_LOCALE_STRING de las funciones de
ordenación ahora está obsoleta por las mismas razones, ya que ordena
utilizando strcoll().
Utilice en su lugar uno de los siguientes métodos de la clase
Collator:
Pasar un objeto como parámetros de los filtros de flujo bzip2.compress y bzip2.decompress ahora está obsoleto, ya que solo se documenta y soporta un array asociativo. Llame primero a get_object_vars() sobre el objeto y pase el array resultante.
Los operadores de desplazamiento (<<,
>>) y de exponenciación (**)
sobre objetos GMP ahora emiten un aviso de
obsolescencia cuando el operando derecho es un float cuya
conversión a int pierde precisión, en coherencia con la
obsolescencia de las conversiones implícitas con pérdida de float a int en
otras partes del lenguaje.
Las funciones mbregex han quedado obsoletas, porque la biblioteca Oniguruma
subyacente ya no se mantiene; su mantenimiento finalizó en abril de 2025.
Las funciones se eliminarán en PHP 9.0.
Para la mayoría de los casos de uso, las funciones
PCRE con el modificador u
son un reemplazo adecuado.
Las funciones afectadas son:
La constante MB_ONIGURUMA_VERSION y las directivas INI
mbstring.regex_retry_limit
y
mbstring.regex_stack_limit
quedan obsoletas junto con ellas.
Pasar un objeto como argumento vars a
mb_convert_variables() ahora está obsoleto, ya que los
objetos se interpretan silenciosamente como el array de sus propiedades
visibles.
Llame primero a get_object_vars() sobre el objeto, o
utilice mb_convert_encoding(), que convierte arrays de
forma recursiva y devuelve el resultado en lugar de modificar su argumento
in situ.
La función mysqli_get_charset() y el método mysqli::get_charset() ahora están obsoletos, sin reemplazo. Exponen detalles internos de implementación del juego de caracteres que carecen de sentido desde el cambio a mysqlnd; en particular, la ordenación (collation) informada no se corresponde con la definida por el servidor. Para obtener el nombre del juego de caracteres actual, utilice mysqli_character_set_name() o mysqli::character_set_name().
La función mysqli_stmt_init() y el método
mysqli::stmt_init() ahora están obsoletos.
Crean un objeto de sentencia vacío que todavía debe prepararse antes de su
uso, y son una fuente de objetos de sentencia que quedan en un estado
incoherente.
Utilice en su lugar mysqli_prepare() o
mysqli::prepare(), que preparan la sentencia en un
solo paso.
Por la misma razón, llamar al constructor
mysqli_stmt::__construct() sin el parámetro
query ahora está obsoleto; pase la consulta al
constructor.
Llamar a ReflectionProperty::setValue() o ReflectionProperty::setRawValue() con un objeto que no es una instancia de la clase en la que se declaró la propiedad ahora está obsoleto. A diferencia de los demás métodos de ReflectionProperty, que lanzan una excepción para tales objetos, estos métodos definen silenciosamente una propiedad en el objeto no relacionado, lo cual no es mejor que una asignación normal y es conceptualmente erróneo.
Pasar un objeto a ReflectionMethod::invoke() o
ReflectionMethod::invokeArgs() al invocar un método
estático ahora está obsoleto.
Los métodos estáticos no tienen $this, por lo que el
objeto se ignoraba por completo y nunca se validaba.
Pase null en su lugar.
Pasar a session_set_save_handler() un objeto que no implemente tanto el método SessionIdInterface::create_sid() como el método SessionUpdateTimestampHandlerInterface::validateId() ahora está obsoleto, independientemente de las interfaces que declare el objeto. Estos métodos son necesarios para que un gestor de guardado se comporte correctamente con session.use_strict_mode, que está activado por defecto a partir de PHP 8.6 y mitiga la fijación de sesión.
En consecuencia, ahora se emite un aviso de obsolescencia cuando una clase implementa SessionHandlerInterface sin definir los métodos SessionIdInterface::create_sid() o SessionUpdateTimestampHandlerInterface::validateId(). En PHP 9.0 estos métodos se moverán de SessionIdInterface y SessionUpdateTimestampHandlerInterface a SessionHandlerInterface, donde serán obligatorios. Implemente ambos métodos en los gestores de guardado personalizados desde ahora.
La función spl_classes() ahora está obsoleta. Ninguna otra extensión expone una función así, y la extensión Reflection siempre está disponible. Utilice en su lugar ReflectionExtension::getClassNames().
La función spl_object_hash() ahora está obsoleta. Desde PHP 8.1 su valor de retorno no es más que un spl_object_id() reformateado, y el nombre es engañoso porque el valor no se deriva del contenido del objeto. La forma en string también es propensa a errores: dos hashes pueden resultar iguales en una comparación flexible porque ambos son strings numéricos. Utilice en su lugar spl_object_id().
Los siguientes métodos de ArrayIterator ahora están obsoletos. Solo existen porque ArrayIterator compartía históricamente su implementación con ArrayObject; la mayoría tienen poco sentido en un iterador e impiden optimizar su implementación. Los métodos correspondientes de ArrayObject no están obsoletos.
Los métodos CSV de SplFileObject ahora están obsoletos. Sus inconsistencias históricas de diseño, puestas aún más de manifiesto por los argumentos con nombre, los han hecho cada vez más difíciles de mantener, y el manejo de CSV no pertenece de forma natural a SplFileObject. Utilice en su lugar fgetcsv() y fputcsv() sobre un flujo.
Pasar un objeto como parámetros de los filtros de flujo zlib.deflate y zlib.inflate ahora está obsoleto, ya que solo se documenta y soporta un array asociativo. Llame primero a get_object_vars() sobre el objeto y pase el array resultante.
Pasar un objeto como argumento options a
deflate_init() o inflate_init() ahora
está obsoleto, ya que los objetos se interpretan silenciosamente como el
array de sus propiedades visibles.
Llame primero a get_object_vars() sobre el objeto y pase
el array resultante.