Методы sleep и wakeup в PHP

Опубликовано: 06.09.2018

видео Методы sleep и wakeup в PHP

Magic Methods in PHP ( __unset ) Part -10

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



Для демонстрации приёмов работы со специальными методами создадим класс "_SW", который будет иметь в своём составе три члена это "_text", "_mytext" и "_time".

Пример работы метода "__sleep()":

class _SW { public function __construct() { $this->_text = 'Член "_text"'; $this->_mytext = 'Член "_mytext"'; } public function __sleep() { $this->_text = 'Член "_text" изменён методом __sleep'; $this->_mytext = 'Член "_mytext" изменён методом __sleep'; return array('_text', '_mytext'); } } $_newSW = new _SW(); echo '<pre>'; print_r($_newSW); serialize($_newSW); print_r($_newSW); echo '</pre>'

Результат:


PHP ООП Трейты

_SW Object ( [_text] => Член "_text" [_mytext] => Член "_mytext" ) _SW Object ( [_text] => Член "_text" изменён методом __sleep [_mytext] => Член "_mytext" изменён методом __sleep )

Теперь попытка использовать функцию "serialize()" применительно к объекту класса "_SW" будет приводить члены "_text" и "_mytext" к новому значению.

Пример работы метода "__wakeup()":

class _SW { public function __construct() { $this->_time = $_SERVER['REQUEST_TIME']; } public function __sleep() { return array('_time'); } public function __wakeup() { $this->_time = $_SERVER['REQUEST_TIME']; } } $_newSW = new _SW(); echo '<pre>'; if (!file_exists('serialize.sl')) { # Получаем готовый сериализованный объект; $_un = serialize($_newSW); # Создаём файл; $_Sl_file = fopen('serialize.sl', "w"); # Сохраняем объект в файл; fwrite($_Sl_file, $_un); } else { # Извлекаем сериализованный объект из файла; $_Sl_file = fopen('serialize.sl', "r"); $unSerial = fread($_Sl_file, filesize('serialize.sl')); } fclose($_Sl_file); echo $unSerial; echo '<br />'; unserialize($unSerial); print_r($_newSW);

Результат:


Урок 30: Математические функции в PHP

O:3:"_SW":1:{s:5:"_time";i:1341259540;} _SW Object ( [_time] => 1341259571 )

Восстановление объекта из состояния сериализации при помощи функции "unserialize()" приведёт к обновлению члена "_time".

rss