unserialize

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

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

Описание

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

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

Внимание

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

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

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

data

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

Если переменная, требующая десериализации, является объектом, то после успешного восстановления объекта PHP автоматически попытается вызвать магические метод __unserialize() или __wakeup() (если он существует).

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

Существует возможность указать функцию обратного вызова, которая будет вызвана, если в процессе десериализации должен быть проинициализирован неопределённый класс. (для предотвращения получения неполного объекта (object) "__PHP_Incomplete_Class"). Используйте php.ini, ini_set() или .htaccess для определения функции unserialize_callback_func. Данная функция будет вызываться каждый раз, когда должен быть проинициализирован неопределённый класс. Для отключения этой возможности, просто оставьте значение директивы пустым.

options

Любые опции unserialize() в виде ассоциативного массива.

Корректные опции
Имя Тип Описание
allowed_classes mixed Массив имён классов, которые должны быть приняты, false для указания не принимать никаких классов или true для приёма всех. Если эта опция задана и unserialize() обнаружит объект неприемлемого класса, то он не будет принят, а вместо этого инстанцируется как объект класса __PHP_Incomplete_Class. Если опция не задана, то она будет считаться установленной в true: PHP будет пытаться инстанцировать объекты любого класса.
max_depth int Максимальная глубина структур, допустимая при десериализации и предназначенная для предотвращения переполнения стека. По умолчанию ограничение глубины составляет 4096 и может быть отключено установкой max_depth значения 0.

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

Возвращается преобразованное значение, которое принимает один из типов bool, int, float, string, array или object.

В случае, если переданная строка не поддаётся десериализации, возвращается false и генерируется E_NOTICE.

Ошибки

Объекты могут выбрасывать Throwable в своих обработчиках десериализации.

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

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

Примеры

Пример #1 Пример использования 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 Пример использования 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.

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