unserialize

(PHP 4, PHP 5, PHP 7, PHP 8)

unserializeCrea una variable PHP a partir de un valor serializado

Descripción

unserialize(string $data, array $options = []): mixed

unserialize() toma una variable serializada (ver serialize()) y la convierte en una variable PHP.

Advertencia

No se debe pasar una entrada de usuario no confiable a la función unserialize() independientemente del valor de allowed_classes en options. La deserialización puede resultar en la ejecución de código cargado y ejecutado durante la instanciación y la autocarga de objetos, y así, un usuario malintencionado podría ser capaz de explotar este comportamiento. Utilice un estándar de intercambio seguro, como JSON (a través de las funciones json_decode() y json_encode()) si necesita pasar datos serializados al usuario.

Si necesita deserializar datos serializados almacenados externamente, considere el uso de hash_hmac() para validar los datos. Asegúrese de que los datos no hayan sido modificados por nadie más que usted.

Parámetros

data

La cadena serializada.

Si la variable deserializada es un objeto, después de reconstruirlo con éxito, PHP intentará automáticamente llamar a los métodos __unserialize() o __wakeup (si alguno de ellos existe).

Nota: Directiva unserialize_callback_func

La retrollamada especificada en la directiva unserialize_callback_func es llamada cuando una clase no definida es deserializada. Si no se especifica ninguna retrollamada, el objeto será instanciado como __PHP_Incomplete_Class.

options

Cualquier opción a proporcionar a unserialize(), en forma de un array asociativo.

Opciones válidas
Nombre Tipo Descripción
allowed_classes array|bool Puede ser un array de nombres de clases que deben ser aceptados, false para no aceptar ninguna clase, o true para aceptar todas las clases. Si esta opción está definida, y unserialize() encuentra un objeto de una clase que no está aceptada, entonces el objeto será instanciado como __PHP_Incomplete_Class. Omitir esta opción equivale a definirla como true: PHP intentará instanciar objetos de cualquier clase.
max_depth int La profundidad máxima permitida de las estructuras durante la deserialización, que está destinada a prevenir desbordamientos de pila. El límite de profundidad por defecto es de 4096 y puede ser desactivado definiendo max_depth a 0.

Valores devueltos

El valor convertido es retornado por la función, y puede ser de tipo booléen, entier, nombre décimal, chaîne de caractères, tableau o objet.

Si la cadena pasada no puede ser deserializada, esta función retorna false y se emite un error E_WARNING.

Errores/Excepciones

Los objetos pueden lanzar Throwables en su gestor de deserialización.

A partir de PHP 8.4.0, si el elemento allowed_classes de options no es un array de nombres de clases, unserialize() lanza TypeError y ValueError.

Historial de cambios

Versión Descripción
8.4.0 Ahora lanza TypeError y ValueError si el elemento allowed_classes de options no es un array de nombres de clases.
8.3.0 Ahora emite un E_WARNING cuando la cadena de entrada contiene datos no consumidos.
8.3.0 Ahora emite un E_WARNING cuando la cadena proporcionada no es deserializable; previamente, se emitía un E_NOTICE.
7.4.0 Se agregó el elemento max_depth a options para definir la profundidad máxima permitida de las estructuras durante la deserialización.
7.1.0 El elemento allowed_classes de options ahora está estrictamente tipado, es decir, si se proporciona algo que no sea un array array o un bool unserialize() retorna false y emite una E_WARNING.

Ejemplos

Ejemplo #1 Ejemplo con unserialize()

<?php
// Aquí, se utiliza <function>unserialize</function> para cargar los datos de sesión
// desde la base de datos, en $session_data. Este ejemplo complementa
// el proporcionado con <function>serialize</function>.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!
odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
// si la preparación o la lectura fallan, se crea un array vacío
$session_data = array();
} else {
// los datos guardados están en $tmp[0].
$session_data = unserialize($tmp[0]);
if (!
is_array($session_data)) {
// Error... inicialización de un array vacío
$session_data = array();
}
}
?>

Ejemplo #2 Ejemplo con la directiva unserialize_callback_func

<?php
$serialized_object
='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback');

function
mycallback($classname)
{
// Simplemente incluya un archivo que contenga su definición de clase
// sabrá qué clase gracias a $classname
var_dump($classname);
}

unserialize($serialized_object);
?>

Notas

Advertencia

false es retornado en los casos donde ocurre un error y si se intenta deserializar un valor serializado igual a false. Es posible interceptar este caso especial comparando data con serialize(false) o atrapando el error E_NOTICE emitido.

Ver también