在 PHP 会话中存储对象

2022-08-30 13:37:57

PHP文档说:“你不能在会话变量中使用引用,因为没有可行的方法来恢复对另一个变量的引用。

这是否意味着我不能拥有这样的东西:

session_start();
$user = new User;
$user->name = 'blah';
$_SESSION['user'] = $user;

我尝试在会话中存储一个简单的字符串和一个User对象,该字符串始终在页面到页面之间或页面刷新后保留。但是,User 变量在 $_SESSION 中丢失(变为空)。

任何想法?

编辑:我已经确认session_id在页面刷新之前和之后在所有这些页面/子页面中都是相同的。

编辑:奇怪的是,在我尝试了下面的序列化和非序列化方法之后,会话中的序列化用户对象(或字符串)仍然消失!

编辑:最后我弄清楚了错误是什么,看起来$_SESSION['user']被某种神秘的力量覆盖了,如果我使用“user”以外的任何变量,那么一切都很好。PHP(至少5.3,这是我正在使用的版本)当你把对象放在$_SESSION时,会自动序列化和取消序列化。

session_start();
$user = new User();
$user->name = 'blah'
$_SESSION['myuser'] = $user; 

答案 1

您需要对 PHP 5 对象使用神奇的__sleep和__wakeup方法

例如,在下面的代码块中:

$obj = new Object();

$_SESSION['obj'] = serialize($obj);

$obj = unserialize($_SESSION['obj']);

__sleep由 serialize() 调用。sleep 方法将从要保留的对象中返回值的数组。

__wakeup由 unserialize() 调用。唤醒方法应采用未序列化的值,并在对象中初始化它们。


答案 2

您的代码示例没有像文档所引用的那样使用引用。这就是 php 通过引用的含义

$var =& $GLOBALS["var"];

至于将对象放入会话中,PHP可以将对象存储在.请参阅 http://example.preinheimer.com/sessobj.php$_SESSION

您看到的是调用和(之前正在调用)的顺序的错误,并且会话模块在关机时无法序列化对象。此错误在 2009 年 9 月 1 日打开。__sleep__destruct__destruct__sleep


推荐