我有以下代码:
class user{
public function __construct(){
}
}
$user = new user;
$id = $_SESSION['user'];
导致错误“无法使用__PHP_Incomplete_Class类型的对象作为数组”。
将$_SESSION['user']
更改为$_SESSION['_user']
会更正此问题。
我只在我的开发环境中遇到过这种情况。我的实时环境不会产生此错误。
我的问题:是否有配置设置将会话密钥'user'视为类对象?
答案 0 :(得分:1)
当我碰到这个时,它是由于调用session_start();加载类定义后。需要首先调用它。
答案 1 :(得分:1)
实际上,还有更多可能导致此问题的事情:
register_globals开启 - 如上所述。我的意思是,register_globals是soo STONE AGE !!!如果关闭就转!
如果您从$ _SESSION加载一个之前未包含的对象 - 设置自动加载器可能有所帮助,但是从我尝试过的,如果它与第1点一起 - 这将无济于事(请再次,请如果仍然打开则关闭1。)
会话变量的实际名称可能会导致问题 - >例如$ _SESSION ['user'] - 加载会话时,PHP(上帝知道为什么)试图寻找一个类“User”,如果它找到了类 - 试图将会话变量视为该类的实例,这可能是导致一个不完整的类事物,因为CLass尚未加载,或者仅仅因为这个变量的结构是错误的(因为它当然拥有不同的数据)。在我的情况下,它是o 1和3的组合。只需将会话变量重命名为$ _SESSION ['save-user']或类似的就可以解决问题
如果发生以上任何一种情况,您可以尝试使用此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']);