Funcionalidades obsoletas

PHP Core

Uso de "namespace" como nombre de constante de clase

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.

Retornar desde un bloque finally

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

Tipo de retorno nullable para __debugInfo()

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.

Retornar valores desde __construct() y __destruct()

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.

Nombrar una función readonly

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.

Uso de let, is o _ como identificador

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.

Tercer argumento de define()

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.

is_a() e is_subclass_of() con un string cuando allow_string es false

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.

metaphone()

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.

Más de 16 filtros en una URL php://filter

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 objetos a array_walk(), array_walk_recursive() y http_build_query()

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.

is_double(), is_long(), is_integer() y doubleval()

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:

strcoll() y SORT_LOCALE_STRING

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:

Bzip2

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.

GMP

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.

MBString

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.

MySQLi

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.

Reflection

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.

Session

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.

SPL

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.

Zlib

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.

+add a note

User Contributed Notes

There are no user contributed notes for this page.