无法将__PHP_Incomplete_Class类型的对象用作数组


Cannot use object of type __PHP_Incomplete_Class as array

我有以下代码:

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

这导致错误"无法将__PHP_Incomplete_Class类型的对象用作数组"。将$_SESSION['user']更改为$_SESSION['_user']可纠正此问题。

我只是在我的开发环境中经历过这种情况。我的生活环境不会产生此错误。

我的问题是:是否存在将会话密钥"user"视为类对象的配置设置?

当我遇到这种情况时,是由于调用session_start();在加载类定义之后。它需要先被调用。

实际上,还有更多的因素会导致这个问题:

  1. register_globals打开-如上所述。我的意思是,register_globals是一个石头时代!!!如果关闭,请关闭!

  2. 如果你从$_SESSION加载一个以前没有包含的对象-设置自动加载器可能会有所帮助,但根据我的尝试,如果它与点1结合在一起-这将没有帮助(所以,再次,如果仍然打开,请关闭1。)

  3. 可能是会话变量的实际名称导致了问题->例如$_session['user']-在加载会话时,PHP(天知道为什么)会试图寻找一个类"user",如果它找到了这个类,就会试图将会话变量视为这个类的实例,这可能会导致类的不完整,因为class还没有加载,或者只是因为这个变量的结构是错误的(当然,因为它包含不同的数据)。在我的情况下,它是o1和3的组合。简单地将会话变量重命名为$_session["se-user"]或类似的名称就可以解决问题

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

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

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

这将解决问题

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

如果要将类的实例存储在会话中,则需要首先对其进行序列化。您可以在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']);