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

sn0*_*0ep 12 php session class

 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;
}}
Run Code Online (Sandbox Code Playgroud)

是我的班级(简化)

以下是我的代码:

$_SESSION['loggedIn'] = $user;
Run Code Online (Sandbox Code Playgroud)

$ 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
)
Run Code Online (Sandbox Code Playgroud)

其中xxxx是正确的值.

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

Kev*_*ans 13

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

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

和:

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

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

  • PHP将[序列化](http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l187)和[unserialize](http:/ /svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l205)会话变量自动生成.这个答案有效的原因是关于确保在反序列化之前定义类的说明. (13认同)

out*_*tis 13

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

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