【问题标题】:Incomplete Object in child method call子方法调用中的不完整对象
【发布时间】:2014-05-17 10:22:19
【问题描述】:

令人困惑的问题,无法想出一个好的标题,但我会尽力解释。

我正在使用 CodeIgniter,并利用 get_instance() 函数访问某些类中的 CI 超级对象。我有一个调用超级对象的父类

abstract class parent{

/**
 * properties
 */
protected $CI;

/**
 * constructor
 */
public function __construct(){
    $this->CI =& get_instance();
}

还有很多子类

class child extends parent{

    public function __construct(){
        //parent
        parent::__construct();

        print_r($this->CI);
    }

    public function doSomething(){
        print_r($this->CI);
    }
}

child 构造函数中打印时,CI 对象很好。在 child doSomething() 方法中打印时,我得到一个不完整的类对象。

编辑:

我相信我已经在一定程度上发现了问题。当 CI 创建它的超级对象时,它使用控制器类。在出现我的问题的情况下,这是Login 控制器。显然,当我通过引用分配时,该名称会继续存在,然后如果我不再在我的 Login 控制器中,则存在不完整类的问题。我可以通过在使用 get_instance() 函数时重新调用它来“修复”它,但这不是一个很好的解决方案。有什么想法吗?

【问题讨论】:

  • 通常情况下,当一个对象在 $_SESSION 中被序列化,并在该对象的原始类定义文件被加载之前通过 session_start() 恢复时,您会遇到这种情况
  • 是的。虽然我有自动加载设置,但这个特定实例没有使用$_SESSION。令人困惑的是它在子构造函数中很好,但在子方法中不行。
  • 但是如果自动加载器是在您的 session_start()之后注册的,那么它仍然会产生问题......我在会话中存储用户对象时遇到了完全相同的问题在 Laravel 中,当 User 对象是从基础对象扩展而来的,但如果我没有那个继承就不是问题
  • 这会给您带来问题吗?我以前做过这种事情,但从来没有遇到过任何问题——当然,我从来没有想过print_r CI 对象:-)
  • 我的session_start 被设置为预控制器挂钩,我的自动加载在我的config.php 文件中完成,该文件在引导程序的早期处理

标签: php codeigniter


【解决方案1】:

所以经过大量查找后,我似乎在 PHP 手册中找到了答案

Warning
You can't use references in session variables as there is no feasible way to restore a reference to another variable.

这就是为什么它在许多地方都可以正常工作的原因,但是如果我从$_SESSION 变量访问它,就像我的登录用户一样,我会收到错误消息。它在创建$_SESSION 变量时存储get_instance(),而不是我需要的引用。

感谢cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多