无法将类型为\uuuPHP\u不完整\u类的对象用作数组

无法将类型为\uuuPHP\u不完整\u类的对象用作数组,php,Php,我有以下代码: class user{ public function __construct(){ } } $user = new user; $id = $_SESSION['user']; 这将导致错误“无法使用类型为uuu PHP_complete_Class的对象作为数组”。 将$\u会话['user']更改为$\u会话['u user']可更正此问题 我只是在我的开发环境中体验到这一点。我的实时环境不会产生此错误 我的问题:是否存在将会话键“user”视为类对象的配

我有以下代码:

class user{
    public function __construct(){
    }
}
$user = new user;
$id = $_SESSION['user'];
这将导致错误“无法使用类型为uuu PHP_complete_Class的对象作为数组”。 将
$\u会话['user']
更改为
$\u会话['u user']
可更正此问题

我只是在我的开发环境中体验到这一点。我的实时环境不会产生此错误


我的问题:是否存在将会话键“user”视为类对象的配置设置?

当我遇到此问题时,是由于调用了会话_start();加载类定义之后。需要首先调用它。

我猜您启用了register\u globals,这意味着全局变量
$user
和会话变量
$\u session['user']
是同一件事,因此当您使用新对象覆盖会话变量
$user=new user

当您调用
session\u start
时,PHP取消序列化存储在会话中的所有内容,如果尚未定义对象的类,则PHP无法取消序列化对象。当您尝试执行类似的操作时,PHP会将其放入一个名为\uuuphp\ucomplete\uclass的特殊无用类中

这将解决问题


这将解决问题$_会话['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']);

事实上,有更多的事情会导致这个问题:

  • register_globals已打开-如上所述。我的意思是,全球是石器时代!!!只要关掉它就行了

  • 如果您从$_会话加载一个之前未包含的对象-设置autoloader可能会有帮助,但根据我的尝试,如果它与第1点一起加载-这将没有帮助(因此,请再次关闭1,如果仍然打开..)

  • 会话变量的实际名称可能会导致问题->例如$\u session['user']-加载会话时,PHP(天知道为什么)会尝试查找类“user”,如果它找到该类,则会尝试将会话变量视为该类的实例,这可能会导致类不完整,因为类还没有加载,或者仅仅因为这个变量的结构是错误的(当然,因为它包含不同的数据)。在我的例子中,它是o1和o3的组合。只需将会话变量重命名为$\u session['save-user']或类似的名称即可解决问题

  • 如果发生上述任何情况,您可以尝试使用此anwser中的代码,该代码修复损坏的会话对象


  • 梅亚克,我现在正遵循你的思路。它似乎与用户类没有任何关系。我稍后会回来报告,谢谢你的帮助。Rick,会话['user']和对象$user是不同的。我的问题是为什么会话['user']被视为类user的新实例?我不相信如果序列化实例,会发生这种情况