unserialize

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

unserialize Создаёт PHP-значение из хранимого представления

Описание

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

Функция unserialize() принимает одну сериализованную переменную и конвертирует её обратно в PHP-значение.

Внимание

Нельзя передавать в функцию unserialize() ненадёжные пользовательские входные данные независимо от значения опции allowed_classes в параметре options. При десериализации функция воссоздаёт объекты и автоматически загружает классы, что ведёт к риску загрузки и выполнения кода, чем пользуются злоумышленники. Вместо этого пользуются безопасным стандартным форматом обмена данными наподобие JSON, который обрабатывают функциями json_decode() и json_encode(), если сериализованные данные требуется передать клиенту.

Данные проверяют функцией hash_hmac(), когда требуется десериализовать значение, которое хранится во внешнем источнике. Разработчики проверяют, что данные никто не изменил, кроме них самих.

Список параметров

data

Сериализованная строка.

После восстановления объекта, который хранит переменная, PHP автоматически вызовет магические методы __unserialize() и __wakeup(), если эти методы определили в классе и при десериализации не возникло ошибок.

Замечание: Директива unserialize_callback_func

Callback-функция, которую указали в директиве unserialize_callback_func, вызывается при десериализации неопределённого класса. PHP создаст объект класса __PHP_Incomplete_Class, если callback-функцию не указали.

options

Ассоциативный массив опций для функции unserialize().

Допустимые опции
Имя Тип Описание
allowed_classes array|bool Опция принимает либо массив (array) с названиями классов, которые примет функция, либо значение false, чтобы функция не принимала никакие классы, либо значение true, чтобы функция принимала все классы. Вместо объекта, класс которого не разрешали принимать, функция unserialize() создаст объект класса __PHP_Incomplete_Class, если опцию определили и функция встретит неразрешённый объект класса. Пропуск опции равносилен определению значения true: PHP попытается создать объекты любого класса.
max_depth int Опция устанавливает глубину структур, которую функции разрешается десериализовать, чтобы предотвратить переполнение стека. По умолчанию ограничение глубины составляет 4096 уровней и отключается путём установки для опции max_depth значения 0.

Возвращаемые значения

Функция возвращает значение, которое получила после преобразования и которое будет принадлежать типу bool, int, float, string, array или object.

Функция возвращает значение false и выдаёт ошибку уровня E_WARNING, если строка не поддаётся десериализации.

Ошибки

Лучше предусмотреть обработку исключений Throwable, которые объекты иногда выбрасывают в своих обработчиках десериализации.

Начиная с PHP 8.4.0 функция unserialize() выбрасывает ошибки TypeError и ValueError, если в элементе allowed_classes параметра options передали не массив (array) с названиями классов.

Список изменений

Версия Описание
8.3.0 Функция теперь выдаёт ошибку уровня E_WARNING, когда входная строка содержит неиспользованные данные.
8.3.0 Функция теперь выдаёт ошибку уровня E_WARNING, если строку невозможно десериализовать; раньше выдавалась ошибка уровня E_NOTICE.
7.4.0 В параметр options добавили элемент max_depth, который устанавливает максимальную глубину десериализации структур.
7.1.0 Для элемента allowed_classes в параметре options определили строгий тип, поэтому функция unserialize() вернёт значение false и вызовет ошибку уровня E_WARNING, если в элементе передали значение не с типом array или bool.

Примеры

Пример #1 Пример воссоздания PHP-значения их хранимого представления функцией unserialize()

<?php

// Воспользуемся функцией unserialize(), чтобы загрузить данные сессии в массив
// $session_data из строки, которую извлекли из базы данных.
// Этим примером дополняется пример, который описывает документация функции serialize()

$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)) {
// Инициализируем пустой массив, если выполнение запроса или извлечение данных завершилось ошибкой
$session_data = array();
} else {
// В этом месте элемент $tmp[0] должен содержать сериализованные данные
$session_data = unserialize($tmp[0]);

if (!
is_array($session_data)) {
// Что-то пошло не так, инициализируем пустой массив
$session_data = array();
}
}

?>

Пример #2 Пример установки callback-функции через директиву unserialize_callback_func

<?php

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

ini_set('unserialize_callback_func', 'mycallback'); // Устанавливаем свою callback-функцию

function mycallback($classname)
{
// Просто подключаем файл с определением класса;
// переменная $classname указывает, определение какого класса требуется
}

?>

Примечания

Внимание

Значение false возвращается как при ошибке, так и при десериализации сериализованного значения false. Этот случай отлавливают путём сравнения значения аргумента data со значением, которое возвращает вызов serialize(false), или путём перехвата ошибки уровня E_NOTICE.

Смотрите также