Оглавление

Преобразование объектов в последовательную форму

В этом разделе уже рассматривались вопросы преобразования сложных структур данных (например, массивов) в последовательную форму (так называемая сериализация). Суть её состоит в том, чтобы сложную структуру преобразовать в строку, которую затем можно сохранять и восстанавливать с помощью функций serialize() и unserialize(). Это преобразование можно осуществлять также и в отношении объектов; однако если принять во внимание природу объектов, то здесь появляются дополнительные функциональные возможности. В процессе преобразования объекта в последовательную форму PHP позволяет выполнять любую необходимую очистку и, при желании, предлагает особый список свойств, которые необходимо сохранить. Впоследствии, во время восстановления объекта с помощью функции unserialize(), PHP позволит воссоздать для объекта любые свойства, которые не были сохранены, и вновь их инициализировать.

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


class UserClass {
    public $sessionID;
    public $username;
    public function __sleep() {
        /* Удаление сеанса */
        session_destroy();
        return array("username");
    }
    public function __wakeup() {
        /* Восстановление сеанса */
        session_start();
        $this->sessionId = session_id();
    }
}
session_start();
$user = new UserClass;
$user->sessionId = session_id();
$seralized_user = serialize($user);
/* Имитация потери переменной $user */
unset($user);
$user = unserialize($serialized_user);

 

В листинге 24 показан пример того, в каких случаях полезно пропускать некоторые свойства класса в процессе преобразования его в строку. Например, класс содержит идентификатор сеанса для данного текущего сеанса, однако при восстановлении класса сеанс оказывается недействительным. Поэтому функция __sleep() сохраняет всю необходимую информацию и повторно создает новое значение для свойства $sessionID в процессе воссоздания класса функцией __wakeup(). Этот способ применим ко многим аспектам, включая ресурсы соединений с базами данных.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити