【问题标题】:PHP problem with "__php_incomplete_class"“__php_incomplete_class”的 PHP 问题
【发布时间】:2011-07-04 18:34:04
【问题描述】:

我正在使用 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

我一直都是这样工作的,从来没有遇到过这样的问题。

谢谢!

【问题讨论】:

    标签: php session codeigniter object


    【解决方案1】:

    当 PHP 试图反序列化会话中的对象时,尚未加载类定义。

    您可以通过使用Autoloading来解决您的问题。

    【讨论】:

    • 会话已自动加载到 autoload.php 文件中,是不是够了?
    • 我不知道你的脚本是做什么的。但我所知道的是:如果你将一个对象放入 $_SESSION,PHP 将序列化它以存储它,并在你再次访问它时取消序列化它。如果类还没有被 PHP 解析/加载,你会得到这样的错误。我建议您检查究竟是哪个对象是罪魁祸首。如果您var_dump() 对象,您可以在有问题的对象上看到__PHP_Incomplete_Class
    • 是的......使用 var_dump 我看到了需要的对象,但类型是 __PHP_Incomplete_Class。我要再次检查我的课程...
    【解决方案2】:

    解决方案有效,但您需要确保在会话之前读取类对象定义:

    $autoload['libraries'] = array('**our class**','session','form_validation');
    

    【讨论】:

    • 模型无法加载到库数组中
    【解决方案3】:

    看看你是否有任何 __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 的所有功能(而且您不会遇到 composer 自动加载和 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 类,并且会出现问题所要求的错误。

    【讨论】:

      【解决方案4】:

      这件事最近发生在我身上,阅读解决方案给了我一个想法。第一个问题是session_start 早于autload,这就是错误。您必须声明您的 autload 或包含此内容,然后您才能执行 session_start

      【讨论】:

      • 我不明白 session_start 的放置会如何导致他报告的错误。你能进一步解释一下吗?
      【解决方案5】:

      session_start() 的位置很重要,因为脚本是从顶部加载到两个。当您在 spl_autoload 会话之前调用它时,在 class(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] =>...)

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 1970-01-01
        • 2015-03-07
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多