不能使用__PHP_Incomplete_Class类型的对象作为数组

时间:2012-09-06 02:33:44

标签: php

我有以下代码:

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

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

我只在我的开发环境中遇到过这种情况。我的实时环境不会产生此错误。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

实际上,还有更多可能导致此问题的事情:

  1. register_globals开启 - 如上所述。我的意思是,register_globals是soo STONE AGE !!!如果关闭就转!

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

  3. 会话变量的实际名称可能会导致问题 - >例如$ _SESSION ['user'] - 加载会话时,PHP(上帝知道为什么)试图寻找一个类“User”,如果它找到了类 - 试图将会话变量视为该类的实例,这可能是导致一个不完整的类事物,因为CLass尚未加载,或者仅仅因为这个变量的结构是错误的(因为它当然拥有不同的数据)。在我的情况下,它是o 1和3的组合。只需将会话变量重命名为$ _SESSION ['save-user']或类似的就可以解决问题

  4. 如果发生以上任何一种情况,您可以尝试使用此anwser中的代码,该代码修复损坏的会话对象forcing access to __PHP_Incomplete_Class object properties

答案 2 :(得分:0)

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

当您调用['user']时,PHP会对会话中存储的所有内容进行反序列化,如果某个对象尚未定义,则PHP无法对该对象进行反序列化。当你尝试做类似的事情时,PHP将它抛入一个名为 __ PHP_Incomplete_Class 的特殊无用类。

这将解决问题

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

调用该方法

答案 3 :(得分: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']);
相关问题