(PECL igbinary >= 1.1.1)
igbinary_serialize — Создаёт компактное, сохраняемое двоичное представление значения
Создаёт сохраняемое представление значения.
Полезно для хранения или передачи значений PHP без потери их типа и структуры.
Чтобы снова превратить сериализованную строку в значение PHP, можно использовать igbinary_unserialize().
value
Значение, которое необходимо сериализовать. igbinary_serialize() обрабатывает все типы, кроме ресурсов (resource) и некоторых объектов (object) (смотрите примечание ниже). Даже массивы (array), содержащие ссылки на себя, могут быть сериализованы функцией igbinary_serialize(). Циклические ссылки внутри сериализующихся массивов (array) или объектов (object) также будут сохранены. Любая другая ссылка будет потеряна.
При сериализации объектов, igbinary будет пытаться вызвать функции __serialize() или __sleep() перед сериализацией. Это позволит объекту выполнить любую очистку в последнюю минуту и т.д. перед сериализацией. Аналогичным образом, когда объект восстанавливается с помощью igbinary_unserialize(), вызывается функция __unserialize() или __wakeup().
Замечание:
Начало имён закрытых членов объекта (object) дополняются именем класса, а начало имён защищённых членов символом
'*'
. Эти дополненные значения окружаются нулевым байтом с обеих сторон.
Возвращает строку, содержащую представление потока байтов value
,
которое может быть сохранено где угодно.
Обратите внимание, что это двоичная строка, которая может включать в себя любое байтовое значение
и должна храниться и обрабатываться как таковая.
Например, вывод функции igbinary_serialize() обычно должен храниться
в поле базы данных BLOB
, а не в поле CHAR
или TEXT
.
Пример #1 Пример использования igbinary_serialize()
<?php
$ser = igbinary_serialize(['test', 'test']);
echo urlencode($ser), "\n";
var_export(igbinary_unserialize($ser));
?>
Результат выполнения приведённого примера:
%00%00%00%02%14%02%06%00%11%04test%06%01%0E%00 array ( 0 => 'test', 1 => 'test', )
Замечание:
Обратите внимание, что многие встроенные объекты PHP не могут быть сериализованы. Однако те, у кого есть такая возможность, реализуют либо интерфейс Serializable, либо магические методы __serialize()/__unserialize() или __sleep()/__wakeup(). Если внутренний класс не соответствует ни одному из этих требований, он не может быть надёжно сериализован с помощью какого-либо сериализатора.
Есть несколько исторических исключений из приведённого выше правила, когда некоторые внутренние объекты могут быть сериализованы без реализации интерфейса или раскрытия методов.