Codeigniter Model Fatal error: Using $this when not in object context

Codeigniter Model Fatal error: Using $this when not in object context

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

整个错误如下:

Fatal error: Using $this when not in object context in /[snip]/application/modules/manage_plugins/models/Manage_plugins.php on line 6 A PHP Error was encountered

Severity: Error

Message: Using $this when not in object context

Filename: models/Manage_plugins.php

Line Number: 6

Backtrace:

从我能找到的其他类似问题来看,这是由于人们试图在静态上下文中使用“$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");

有人知道为什么会这样吗?

感谢 rexmarc,我能够解决这个问题,并通过 use-ing 匿名对象 $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 - Anonymous functions may use $this, as well as be declared statically

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

由于 PHP 开发 (5.5) 和生产 (5.3) 版本不同,此问题未引起注意。

另请参阅: