Функции РНР serialize() и unserialize(), могут работать не только с массивами, но и с объектами. При этом вызов serialize() упаковывает объект, переданный его параметром, в строку, а unserialize(), наоборот, получает на вход упакованную ранее строку (возможно, считанную из файла или базы данных) и возвращает созданный по ней объект.
РНР позволяет программисту управлять процессом сериализации и десериализации.
· При упаковке (serialize()) вы можете решать, какие свойства объекта необходимо помещать в результирующую строку, а какие следует пропустить (не сохранять). Для этого необходимо создать в классе метод со специальным ("магическим") именем _sleep(). Он будет автоматически вызываться РНР перед сериализацией. Метод должен возвращать список имен свойств (public, protected, private - не имеет значения), подлежащих сериализации. Все свойства, не указанные в этом списке, будут проигнорированы при упаковке (и, соответственно, не восстановятся при по следующем вызове unserialize()). Обычно к таким свойствам причисляют различные служебные переменные, которые нежелательно где-либо сохранять.
|
|
· После распаковки (unserialize()) можно выполнять дополнительные действия - например, инициализировать динамические свойства объекта (вроде открытых файлов, подключений к базе данных и т. д.). Необходимый код следует поместить в метод _wakeup(). Учтите, что он вызывается уже после инициализации нового объекта, а значит, может получить доступ к свойствам, сохраненным ранее по serialize().
Если в одном из свойств объекта хранится другой объект, то при упаковке и распаковке будут вызваны его методы _sleep() и _wakeup(). Это произойдет даже в том случае, если дочерние объекты хранятся в свойстве-массиве. Таким образом, сериализация имеет каскадный характер: она корректно работает вне зависимости от того, хранит ли объект вложенные подобъекты или нет.
ЗАМЕЧАНИЕ
При сериализации РНР сохраняет не только рubliс-свойства объекта, но также protected и private. Соответственно, после распаковки их значения корректно восстанавливаются. Это позволяет корректно упаковывать в строку объекты сложной структуры.