Одной из особенностей PHP является то, что продолжительность жизни создаваемых с его помощью объектов, как правило, очень невелика. Это связано с тем, что все переменные и объекты уничтожаются после завершения скрипта. Протокол HTTP не является сессионным, то есть каждое обращение к серверу воспринимается как обращение нового клиента, а история его предыдущих обращений не сохраняется. Разработчик приложения должен сам реализовывать сохранения состояния приложения для каждого из клиентов, прибегая к сессиям и кукам. В таких условиях приобретает большое значение возможность передачи объекта между несколькими сеансами клиента или даже между отдельными страницами web-приложения.
Для сохранения объекта в формате, который бы позволял в дальнейшем его восстановить, часто прибегают к сериализации, переводу объекта в строку при помощи функции "serialize()". Такая строка может быть сохранена в файл или базу данных, а затем из неё можно получить сохранённый объект при помощи обратной функции "unserialize()". Сериализации могут подвергаться не только объекты, но и массивы в том числе многомерные.
Для демонстрации примеров работы с функциями "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)"
В следующей статье поговорим о сохранении сериализованного объекта в сессиях.
4941