0

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

整个错误如下:

致命错误:在第 6 行的 /[snip]/application/modules/manage_plugins/models/Manage_plugins.php 中不在对象上下文中使用 $this 遇到 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");

有谁知道为什么会这样?

4

1 回答 1

1

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

我更改了以下内容:

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

于 2016-07-13T18:30:16.760 回答