2011-01-29 3 views
6

Я пытаюсь сохранить объект в $_SESSION, но следующее:PHP сохранение объекта в сессии

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = $user ; 

# on subsequent page loads: 
$user = $_SESSION[ 'user' ] ; #retrieve the user from session 

К сожалению, это не работает.

Сценарий попытался выполнить метод или получить доступ к объекту неполного объекта. Убедитесь, что загружено определение класса «Пользователь» объекта, с которым вы пытаетесь работать, _before_ unserialize() вызывается или предоставляет функцию __autoload() для загрузки определения класса

Если вы не используете serialize():

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = serialize($user) ; 

# on subsequent page loads: 
$user = unserialize($_SESSION[ 'user' ]) ; #retrieve the user from session 

Я предполагаю, что потребуется выполнить сериализацию, поскольку информация сеанса сохраняется на диске. Но не должен ли PHP быть достаточно умным, чтобы сериализовать материал самостоятельно?

И с использованием сериализации/_ десериализации _, это собирается теперь работать надежно? Или мне нужен метод __serialize() в моем классе PHP?

+0

Вы когда-нибудь думали об использовании Zend.Session? –

ответ

4

Вам понадобится __serialize() в вашем классе, если ваш объект должен выполнить какое-либо действие перед сериализацией. Например, если у него есть ссылка на открытый файл, и этот файл должен быть правильно закрыт перед сериализацией.

+2

В этом случае вы должны использовать __sleep и __wakeup

+2

Мои извинения, вот что я имел в виду, нет метода магии php, называемого __serialize (). –

1

Возможно, вы используете var_export? Я только что узнал об этом сегодня, так что, возможно, это не так важно.

+0

'var_export()' на самом деле не является функцией сериализации. Это просто создать понятное для пользователя строковое представление переменной (например, «var_dump()». Оно не создает полного представления переменной, и нет обратной функции. Http://php.net/manual/en /function.var-export.php –

+1

@ Lèse Мое понимание 'var_export' состояло в том, что возвращаемая строка может быть' eval' ed, чтобы получить (более или менее) одну и ту же переменную. Это неверно? – sdleihssirhc

+0

Ах, вы Я смутил его с помощью 'print_r()'. Однако еще лучше сериализовать объекты с помощью 'serialize()', так как есть случаи, когда вывод 'var_export()' не даст правильных результатов (например, объекты с округлыми ссылками). –

0

Что касается компилятора php, все, что вы делаете, это запись объекта (сериализованного) в Array его другим процессом, который обеспечивает $ _SESSION на следующей странице. Сериализация не имеет ничего общего с записью на диск больше, чем с памятью, поскольку память, выделенная для различных методов вашего объекта, не будет доступна на следующей странице. Сериализация - это то, как PHP держится на объектах на разных страницах, и вы должны сделать это сами.

0

Вероятно лучший подход этого дня заключается в реализации Serializable интерфейс вашего класса.

Смежные вопросы