Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Упаковка и распаковка объектов

Для демонстрации приемов работы с функциями serialize() и unserialize() создадим вспомогательный класс cls, содержащий единственный открытый член $var, инициализация которого осуществляется в конструкторе класса (листинг 6).

Листинг 6. Класс cls. Файл cls.php

В листинге 7 представлен скрипт, который сериализует объект $obj класса cls в строку, а строку сохраняет в файл text.obj.

Листинг 7. Сериализация объекта $obj класса cls. Файл serialize.php

Результатом работы скрипта из листинга 7 будет файл text.obj, содержащий следующую строку:

O:3:"cls":1: {s:3:"var";i:100;}

Данная строка предназначена для функции unserialize() и позволяет восстановить объект в другом файле (листинг 8).

Листинг 8 Восстановление объекта из строки. Файл unserialize.php

Результатом работы сценария из листинга 8 будет следующий дамп объекта $obj:

Важно, чтобы в момент восстановления объекта скрипт имел доступ к классу cls, иначе восстановление объекта будет проведено лишь частично. По сути, будет создан объект-контейнер, в котором будут присутствовать члены класса cls, однако отсутствовать какие бы то ни было методы.

Методы _sleep() и _wakeup()

При сохранении и восстановлении объекта при помощи функций serialize() и unserialize() может потребоваться осуществить ряд действий, например: убрать из объекта данные, которые не должны подвергаться сериализации, или скорректировать их значения, если они теряют актуальность. Для осуществления подобных действий предназначены два специальных метода, которые могут быть перегружены в классе:

· _ sleep() - метод вызывается, когда объект подвергается сериализации при помощи функции serialize();

· _ wakeup() - метод вызывается при восстановлении объекта при помощи функции unserialize().

Оба метода не принимают никаких дополнительных параметров.

Для демонстрации приемов работы со специальными методами _sleep() и _wakeup() создадим класс user, который будет иметь в своем составе следующие члены:

· name - имя пользователя;

· $password - его пароль (если поле пустое, то пользователь перенаправляется на страницу авторизации);

· $referrer - последняя посещенная страница;

· $time -время авторизации пользователя.

Ниже приводится возможная реализация класса user.

Подвергнем объект $obj класса user процедуре сериализации (листинг 9).

Листинг 9 Сериализация объекта класса user. Файл user_serialize.php

Результатом работы скрипта из листинга 9 будут следующие строки:

При сериализации объекта часто необходимо скрыть параметр Spassword, чтобы не допускать его сохранения на жестком диске в незашифрованном виде. Для решения этой задачи как нельзя лучше подходит метод sleep(), возвращающий массив полей, которые должны подвергаться сериализации функцией serialize(). По сути, метод _sleep() выступает в качестве фильтра, позволяя настроить процесс сериализации на избирательное сохранение информации (рис. 2).

Рис. 2. Схема сериализации объекта

Ниже представлен модифицированный вариант класса user, который обнуляет значение члена Spassword при сериализации объекта.

Результат работы скрипта может выглядеть следующим образом:

Как видно, из сериализованной строки пропало поле password.

Восстановление объекта из сериализованного состояния при помощи функции unserialize() приведет к созданию объекта, в котором сохраняется время авторизации пользователя $time. Разумно при этом обновить член $time при вызове функции unserialize(). Для решения этой задачи предназначен специальный метод _wakeup(), который вызывается сразу после восстановления объекта (рис. 3).

Рис. 3. Схема восстановления объекта

В листинге 10 представлен модифицированный класс user, который обеспечивает обновление времени авторизации пользователя при восстановлении объекта.

Листинг 10 Использование методом _sleep() и _wakeup(). Файл user.php

В листинге 11 представлен скрипт, который демонстрирует восстановление объекта из сериализованноrо состояния с обновлением члена $time.

Листинг 11 Восстановление объектов. Файл user_unserialize.php

Результатом работы скрипта из листинга 11 будет следующий дамп объекта класса user:


 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...