Вам необходимо использовать магические методы __sleep и __wakeup для объектов PHP 5.
Например, в следующем блоке кода:
$obj = new Object();
$_SESSION['obj'] = serialize($obj);
$obj = unserialize($_SESSION['obj']);
__ sleep вызывается сериализацией (). Метод сна вернет массив значений из объекта, который вы хотите сохранить.
__ wakeup вызывается unserialize (). Метод пробуждения должен принимать несериализованные значения и инициализировать их в объекте.
Это ожидаемое поведение. Сохранение ссылки на объект будет работать только в том случае, если место в памяти для объекта не изменилось. В протоколе без сохранения состояния, таком как HTTP, состояние приложения не сохраняется между запросами. Следующий запрос может быть обработан в другом потоке, процессе или другом сервере.
Учитывая неотъемлемую природу веб-приложения без сохранения состояния, хранение указателя на ячейку памяти бесполезно. Следовательно, состояние объекта должно быть разбито на формат хранения, сохранено или передано, а затем при необходимости восстановлено. Этот процесс известен как Сериализация .
Вы можете выбрать сериализацию всего объекта в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен путем запроса базы данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.
а затем при необходимости восстановлен. Этот процесс известен как Сериализация .Вы можете выбрать сериализацию всего объекта в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен, запросив базу данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.
а затем при необходимости восстановлен. Этот процесс известен как Сериализация .Вы можете сериализовать весь объект в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен, запросив базу данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.
[EDIT]
JPot указал, что объекты автоматически сериализуются в $ _SESSION, поэтому явная сериализация не требуется. Я оставлю ответ потомкам, но, очевидно, это не решит вашу проблему.
В вашем примере кода не используются ссылки, как в документации. Это то, что php подразумевает под ссылками :
$var =& $GLOBALS["var"];
Что касается помещения объектов в сеанс, PHP может хранить объекты в $ _ SESSION
. См. http://example.preinheimer.com/sessobj.php .
Вы видите ошибку в порядке вызовов __ sleep
и ] __ destruct
( __ destruct
вызывается до __ sleep
) и модулю сеанса не удается сериализовать объект при завершении работы. Эта ошибка была обнаружена 1 сентября 2009 г.