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'] - >用户名”它向我返回一个空值。
答案 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
变量似乎只能存储数组,数字和字符串。
更改为新页面后,他们无法存储类对象。