Codeigniter模型致命错误:当不在对象上下文中时使用$ this

时间:2016-07-11 23:53:38

标签: php codeigniter mediator codeigniter-hmvc

我有一些问题,一些代码适用于开发但不适用于生产。这很奇怪,因为所有其他代码都有效(或似乎)。

整个错误如下:

  

致命错误:在不在对象上下文中时使用$ this   /[snip]/application/modules/manage_plugins/models/Manage_plugins.php   第6行遇到PHP错误

     

严重性:错误

     

消息:不在对象上下文中时使用$ this

     

文件名:models / Manage_plugins.php

     

行号:6

     

回溯:

从我能找到的其他类似问题来看,这是由于人们试图使用" $ this"在静态环境中 - 我不相信我的情况。

这是manage_plugins构造函数,第6行(错误行)是构造函数中的第一个:

class Manage_plugins extends CI_Model {

    public function __construct() {
        $this->mediator->attach("manage_load", function($name, $data) { $this->on_manage_load(); });

        $this->load->model("automediator");
    }

}

它由以下代码加载(并且从未明确调用):

$CI =& get_instance();

$CI->load->model("manage_plugins/manage_plugins");

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

感谢rexmarc,我能够解决这个问题,并通过use在匿名函数中创建对象$this的副本,在PHP 5.3上使用类似的结构。

我更改了以下内容:

class Manage_plugins extends CI_Model {
    public function __construct() {
        $this->mediator->attach("manage_load", function($name, $data) { $this->on_manage_load(); });

        $this->load->model("automediator");
    }

}

进入:

class Manage_plugins extends CI_Model {
    public function __construct() {
        $me =& $this;
        $this->mediator->attach("manage_load", function($name, $data) use($me) { $me->on_manage_load(); });

        $this->load->model("automediator");
    }

}

另一种解决办法可能是:

class Manage_plugins extends CI_Model {
    public function __construct() {
        $this->mediator->attach("manage_load", [$this, 'on_manage_load']);

        $this->load->model("automediator");
    }

}

问题出现了,因为在5.4之前的PHP版本中,$this在匿名函数中不可用。

  

5.4.0 - 匿名函数可以使用$ this,也可以静态声明

来源:http://php.net/manual/en/functions.anonymous.php

由于开发(5.5)和生产(5.3)上的PHP版本不同,这个问题没有引起注意。

另请参阅:https://stackoverflow.com/a/19432335/3649573