Сериализация объектов в PHP
Опубликовано: 06.09.2018
Одной из особенностей PHP является то, что продолжительность жизни создаваемых с его помощью объектов, как правило, очень невелика. Это связано с тем, что все переменные и объекты уничтожаются после завершения скрипта. Протокол HTTP не является сессионным, то есть каждое обращение к серверу воспринимается как обращение нового клиента, а история его предыдущих обращений не сохраняется. Разработчик приложения должен сам реализовывать сохранения состояния приложения для каждого из клиентов, прибегая к сессиям и кукам. В таких условиях приобретает большое значение возможность передачи объекта между несколькими сеансами клиента или даже между отдельными страницами web-приложения.
Для сохранения объекта в формате, который бы позволял в дальнейшем его восстановить, часто прибегают к сериализации , переводу объекта в строку при помощи функции "serialize()". Такая строка может быть сохранена в файл или базу данных, а затем из неё можно получить сохранённый объект при помощи обратной функции "unserialize()". Сериализации могут подвергаться не только объекты, но и массивы в том числе многомерные.
Сериализация на обекти – ООП Урок 24
Для демонстрации примеров работы с функциями "serialize()" и "unserialize()" создадим класс " ClassSerialize", содержащий единственный открытый член "$serialize", инициализация которого будет осуществляться в конструкторе класса.
Пример который сериализует объект "$obj_serialize" класса "ClassSerialize" в строку, а строку сохранит в файл "serialize.sl":
class ClassSerialize { public $serialize; public function __construct($serialize) { $this->serialize = $serialize; } } # Создаём объект; $obj_serialize = new ClassSerialize(1000); # Сериализуем объект; $_result = serialize($obj_serialize); # Сохраняем объект в файл; $_new_file = fopen('serialize.sl', "w"); if(!$_new_file) exit('Ошибка работы с файлом'); fwrite($_new_file, $_result); fclose($_new_file); Результатом работы скрипта будет файл "serialize.sl", содержащий следующую строку:O:14:"ClassSerialize":1:{s:9:"serialize";i:1000;}
Данная строка предназначена для функции "unserialize()" и позволяет восстановить объект в другом файле.Восстановление объекта из строки:
class ClassSerialize { public $serialize; public function __construct($serialize) { $this->serialize = $serialize; } } # Извлекаем сериализованный объект из файла; $_file = fopen('serialize.sl', "r"); if(!$_file) exit('Ошибка работы с файлом'); $_result = fread($_file, filesize('serialize.sl')); fclose($_file); # Восстанавливаем объект; $_unserialize = unserialize($_result); # Выводим дамп объекта; echo '<pre>'; print_r($_unserialize); echo '</pre>';Результат:
ClassSerialize Object ( [serialize] => 1000 )Важно, чтобы при восстановлении объекта скрипт имел доступ к классу "ClassSerialize", иначе восстановление объекта выполниться не полностью. По сути, будет создан объект-контейнер, в котором имеются члены класса "ClassSerialize", однако отсутствуют какие бы то ни было методы.
Объект-контейнер создаться в том случае если класс "ClassSerialize" не будет найден:
"__PHP_Incomplete_Class Object([__PHP_Incomplete_Class_Name] => ClassSerialize[serialize] => 1000)"В следующей статье поговорим о сохранении сериализованного объекта в сессиях .
tillad
3326