我正在使用CodeIgniter开发一个网站,并创建了一个用户和一个会话:
$user->first_name = 'Gerep';
$user->gender = 'M';
$user->age = '26';
$this->session->set_userdata('user', $user);
但是当我尝试访问会话对象时:
echo $this->session->userdata('user')->first_name;
它返回一个错误:Object of class __PHP_Incomplete_Class could not be converted to string
我一直都是那样工作,从来没有遇到过这个问题。
谢谢!
答案 0 :(得分:4)
当PHP试图在会话中反序列化对象时,尚未加载类定义。
您可以使用Autoloading来解决您的问题。
答案 1 :(得分:2)
解决方案有效,但您需要确保在会话之前读取类对象定义:
$autoload['libraries'] = array('**our class**','session','form_validation');
答案 2 :(得分:0)
看看你是否有任何__autoload($ class)并将其更改为使用spl_autoload_register()方式。例如:
function __autoload($class)
{
if (file_exists(APPPATH . 'core/' . $class .EXT)) {
require_once APPPATH . 'core/' . $class . EXT;
} else {
if (file_exists(APPPATH . 'libraries/' . $class . EXT)) {
require_once APPPATH . 'libraries/' . $class . EXT;
}
}
}
将更改为:
function CIautoload($class)
{
if (file_exists(APPPATH . 'core/' . $class .EXT)) {
require_once APPPATH . 'core/' . $class . EXT;
} else {
if (file_exists(APPPATH . 'libraries/' . $class . EXT)) {
require_once APPPATH . 'libraries/' . $class . EXT;
}
}
}
spl_autoload_register('CIautoload');
通过这种方式,您将能够使用所有PHP 5.3的强大功能(并且您将无法解决作曲家自动加载和CI,; D)
如果过了一段时间使用PHP 5.2,你就开始使用PHP> 5.3和所有OO编码方式,您将开始使用spl_autoload_register
。使用CI,在使用PHP 5.2的项目中,因为你无法使用spl_autoload_register
人们使用已知的hack来使用他们通常在config.php文件中编写的function __autoload($class)
来自动化类。
问题是当你混合两者时,spl_autoload_register
函数将覆盖你的__autoload
类,并且会出现问题所引发的错误。
答案 3 :(得分:0)
最近我遇到这种情况,阅读解决方案给了我一个想法。第一个问题是session_start
早于autload
,这就是错误。您必须声明autload
或包含此内容,然后才能执行session_start
。
答案 4 :(得分:0)
session_start()的位置很重要,因为脚本是从顶部加载到Bothom的。在spl_autoload会话在cllass(Object)之前加载之前调用它时,并且不知道将数据放在何处,因此已将其创建为__PHP_Incomplete_Class对象。 之前:
session_start();
spl_autoload_register(function($class){
require_once 'classes/'.$class.'.php';
});
结果:__ PHP_Incomplete_Class对象([__PHP_Incomplete_Class_Name] =>用户[id] ...) 之后:
spl_autoload_register(function($class){
require_once 'classes/'.$class.'.php';
});
session_start();
结果:用户对象([id] => ...)