我可以在$ _SESSION空间中存储类实例吗?

时间:2011-08-16 18:38:18

标签: php class session

 Class User{

public $id;
public $username;
public $password;
public $email;
public $steam;
public $donator;
public $active;

public function __construct($username, $email, $password, $id, $active, $donator, $steam){
    $this->id = $id;
    $this->username = $username;
    $this->password = $password;
    $this->email = $email;
    $this->steam = $steam;
    $this->donator = $donator;
    $this->active = $active;
}}

是我的班级(简化)

以下是我的代码:

$_SESSION['loggedIn'] = $user;

$ user是User

的类实例

现在这就是print_r($ _ SESSION ['loggedIn'])向我展示的内容:

    __PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => User
    [id] => 22
    [username] => xxxx
    [password] => xxxx
    [email] => xxxx
    [steam] => 1234567
    [donator] => 0
    [active] => 1
)

其中xxxx是正确的值。

但是当我尝试从我的会话中检索数据时。像这样:“$ _SESSION ['loggedIn'] - >用户名”它向我返回一个空值。

4 个答案:

答案 0 :(得分:13)

您必须先将对象序列化为字符串:

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

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

确保在反序列化对象之前首先定义类。

答案 1 :(得分:11)

您可以在$_SESSION中存储对象。 PHP将为您序列化它们。只需确保在调用session_start之前定义了类,或者它可以是autoloaded。存储在会话中的值具有类型“__PHP_Incomplete_Class_Name”的原因是,在会话加载期间反序列化对象时未定义User类(如object serialization上的PHP手册页中所述)。

资源无法序列化。如果您存储使用资源的对象,请实现__sleep and __wakeup以自定义序列化。 PHP的序列化应该能够处理所有其他类型,即使它们包含循环引用。

答案 2 :(得分:2)

在同一页面上,session变量就像另一个变量一样,所以你可以用它做你想要的。这就是为什么你可以在该页面上存储对象的原因。

稍后检索它实际上会显示它是否适合session,而不是你的情况。

如果确实需要保存该对象,可以尝试将其保存为序列化对象,并在检索后对其进行反序列化。这应该有效,虽然我不知道这是否是最好的溶剂/设计。像这样传递物体可能会被认为有点......反模式

答案 3 :(得分:-1)

$_SESSION变量似乎只能存储数组,数字和字符串。

更改为新页面后,他们无法存储类对象。