Приднестровская поддержка XOOPS
В этом разделе уже рассматривались вопросы преобразования сложных структур данных (например, массивов) в последовательную форму (так называемая сериализация). Суть её состоит в том, чтобы сложную структуру преобразовать в строку, которую затем можно сохранять и восстанавливать с помощью функций 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(). Этот способ применим ко многим аспектам, включая ресурсы соединений с базами данных.
Отправитель | Нити |
---|
3 пользователь(ей) активно (1 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 3 далее... |