Перехват сериализации

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

РНР позволяет программисту управлять процессом сериализации и десериализации.

· При упаковке (serialize()) вы можете решать, какие свойства объекта необходимо помещать в результирующую строку, а какие следует пропустить (не сохранять). Для этого необходимо создать в классе метод со специальным ("магическим") именем _sleep(). Он будет автоматически вызываться РНР перед сериализацией. Метод должен возвращать список имен свойств (public, protected, private - не имеет значения), подлежащих сериализации. Все свойства, не указанные в этом списке, будут проигнорированы при упаковке (и, соответственно, не восстановятся при по­ следующем вызове unserialize()). Обычно к таким свойствам причисляют различные служебные переменные, которые нежелательно где-либо сохранять.

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

Если в одном из свойств объекта хранится другой объект, то при упаковке и распаковке будут вызваны его методы _sleep() и _wakeup(). Это произойдет даже в том случае, если дочерние объекты хранятся в свойстве-массиве. Таким образом, сериализация имеет каскадный характер: она корректно работает вне зависимости от того, хранит ли объект вложенные подобъекты или нет.

ЗАМЕЧАНИЕ

При сериализации РНР сохраняет не только рubliс-свойства объекта, но также protected и private. Соответственно, после распаковки их значения корректно восстанавливаются. Это позволяет корректно упаковывать в строку объекты сложной структуры.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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