(PHP 4, PHP 5, PHP 7, PHP 8)
serialize — Генерирует сохраняемое представление переменной
Функция генерирует сохраняемое представление переменной.
Такое представление полезно для хранения или передачи PHP-значений между скриптами без потери типа и структуры.
Для превращения сериализованной строки обратно в PHP-значение вызывают функцию unserialize().
value
Значение, которое требуется сериализовать. Функция serialize() обрабатывает все типы, кроме resource и отдельных типов object, как говорится в примечании. Функция даже умеет сериализовать массивы, которые содержат ссылки на себя. Циклические ссылки внутри сериализуемого массива или объекта также сохраняются. Любые другие ссылки утратятся.
При сериализации объекта PHP пытается вызвать перед операцией магические методы __serialize() или __sleep(). Это делается, чтобы разрешить объекту в последний момент перед сериализацией произвести очистку и другие похожие операции. Аналогично, когда объект восстанавливается функцией unserialize(), вызывается магический метод __unserialize() или __wakeup().
Замечание:
Начало названий закрытых членов объекта дополняются названием класса, а начало названий защищённых членов символом '*'. Эти дополненные значения окружаются с обеих сторон нулевым байтом — 0x00.
Функция возвращает строку, которая содержит представление значения
value
в виде потока байтов. Такое представление доступно для сохранения в произвольном хранилище.
Обратите внимание, что это бинарная строка, которая иногда включает нулевые байты, и которую требуется хранить и обрабатывать с учётом содержания. Например, вывод функции serialize() лучше хранить в BLOB-поле базы данных, а не в полях с типом CHAR или TEXT.
Пример #1 Пример сериализации значения функцией serialize()
<?php
// Переменная $session_data содержит многомерный массив с сессионной
// информацией о текущем пользователе. Функция serialize() сохраняет
// эту информацию в базе данных в конце запроса.
$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare(
$conn,
"UPDATE sessions SET data = ? WHERE id = ?"
);
$sqldata = array(serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
$stmt = odbc_prepare(
$conn,
"INSERT INTO sessions (id, data) VALUES(?, ?)"
);
if (!odbc_execute($stmt, array_reverse($sqldata))) {
/* Код при ошибке */
}
}
?>
Замечание:
Обратите внимание, бо́льшая часть встроенных в PHP объектов не поддерживает сериализацию. Однако объекты, которые всё-таки поддерживают сериализацию, или реализуют интерфейс Serializable, или определяют магические методы __serialize() и __unserialize() или __sleep() и __wakeup(). Встроенные классы, которые не удовлетворяют ни одному из этих требований, невозможно надёжно сериализовать.
PHP включает ряд исторических исключений из приведённого правила, когда отдельные внутренние объекты сериализовавались без реализации интерфейса или магических методов.
При сериализации объектов функцией serialize() ведущий обратный слеш не включается в название класса, который определили в пространстве имён, для наилучшей обратной совместимости.