1

我有以下代码:

class user{
    public function __construct(){
    }
}
$user = new user;
$id = $_SESSION['user'];

这会导致错误“不能使用 __PHP_Incomplete_Class 类型的对象作为数组”。更改$_SESSION['user']$_SESSION['_user']更正此问题。

我只在我的开发环境中遇到这种情况。我的生活环境不会产生这个错误。

我的问题:是否有将会话键“用户”视为类对象的配置设置?

4

4 回答 4

1

实际上,还有更多的事情可以导致这个问题:

  1. register_globals 已打开 - 如上所述。我的意思是,register_globals 太石化了!!!如果关闭就关闭!

  2. 如果您从 $_SESSION 加载一个之前未包含的对象 - 设置自动加载器可能会有所帮助,但根据我的尝试,如果它与第 1 点一起使用 - 这将无济于事(所以再次,如果仍然打开,请关闭 1 ..)

  3. 会话变量的实际名称可能会导致问题 -> 例如 $_SESSION['user'] - 在加载会话时,PHP(天知道为什么)会尝试查找类“User”,如果找到class - 尝试将会话变量视为此类的实例,这可能会导致类的不完整,因为 CLass 尚未加载,或者只是因为该变量的结构错误(因为它包含不同的数据课程)。在我的情况下,它是 1 和 3 的组合。只需将会话变量重命名为 $_SESSION['save-user'] 或类似的东西就可以解决问题

  4. 如果发生上述任何情况,您可以尝试使用此 anwser 中的代码,它修复了损坏的会话对象,强制访问 __PHP_Incomplete_Class 对象属性

于 2013-06-11T08:35:21.217 回答
1

当我遇到这个是由于调用 session_start(); 加载类定义后。它需要首先被调用。

于 2012-09-06T02:38:31.543 回答
0

如果你想在会话中存储你的类的一个实例,你需要先序列化它。您可以在 PHP 中使用标准的 serialize() 函数。检索您的信息,使用 unserialize() 函数。

class User()
{
    private $id;
    // other

    public function __construct()
    {
        //
    }
}

// Set the session
$newUser = new User();
$_SESSION['mySession'] = serialize($newUser);

// Retrieve session info
$myUser = unserialize($_SESSION['mySession']);
于 2012-09-06T13:16:07.880 回答
0

我的猜测是你启用了 register_globals 这意味着全局变量$user和会话变量$_SESSION['user']是同一件事,所以当你用新对象$user = new user覆盖你的会话变量时['user']

当您调用时,PHP 会反序列化存储在会话中的所有内容,session_start如果尚未定义对象的类,PHP 将无法反序列化对象。当您尝试执行类似的操作时,PHP 会将其放入一个特殊的无用类中,称为__PHP_Incomplete_Class

这将解决问题

这将解决问题 $_SESSION['user'] 是一个对象,而不是一个数组,并且您不能使用数组表示法访问对象(即:['index'])*。如果'index'是一个公共属性,你可以使用->index访问它,否则你需要在你的类中添加一个方法来获取'index'并使用->get_index()调用该方法;

于 2012-09-06T02:38:51.247 回答