Сериализуемый интерфейс PHP - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь сохранить большой класс, называемый Authorizer, который содержит ссылку на соединение с базой данных и контейнер других объектов, представляющих результат сложного набора запросов к базе данных. Я хочу сериализовать дорогостоящее, чтобы построить части этого объекта в сеансе. Затем, когда мне нужно задать Авторизатору вопрос, я хочу разбудить объект Авторизатора вместо создания нового для каждой страницы. Я пишу пользовательский обработчик для временного хранения этого объекта в таблице базы данных. Я понимаю, что магический метод __sleep () обычно используется для обработки выбора частей объекта для хранения, а затем __wakeup () используется для восстановления соединения с базой данных.

Это где я становлюсь нечетким. Я думаю, что serialize () и unserialize () должны работать вместо конструктора и деструктора, но я не совсем понимаю, как они взаимодействуют с __sleep () и __wakeup (). Затем я добрался до части руководства, описывающей сериализуемый интерфейс, и подумал, что хорошо, я смогу реализовать это и быть уверенным, что у меня есть это право. Затем я прочитал, что классы, которые реализуют этот интерфейс, больше не поддерживают __sleep () и __wakeup ()! Это была единственная часть всей этой вещи, которую я действительно понял>: - {Я не смог найти никаких примеров того, как правильно реализовать этот интерфейс.

Итак, мой вопрос: каков предпочтительный способ реализации сериализации в полностью объектно-ориентированной системе? Сериализуемый интерфейс предназначен для замены старого метода? Какова цель наличия двух разных наборов функций (_ sleep () / _wakeup () и serialize () / unserialize ())?

1 Ответ

2 голосов
/ 10 ноября 2011

__sleep и __wakeup вызываются по умолчанию serialize / unserialize методами для подготовки объекта к сериализации.Это работает в случае, когда метод PHP по умолчанию действительно близок к тому, что вам нужно, и вам просто нужно выполнить некоторую очистку вокруг процесса.

Если вы реализуете интерфейс Serializable, тогда нет необходимостиэти методы вы заявляете, что сами реализуете весь процесс сериализации.Так что любая работа, которая обычно выполняется в __sleep, будет включена в serialize, и то же самое с __wakeup и unserialize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...