double arrow

Методы _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:


 







Сейчас читают про: