我有一些问题,一些代码适用于开发但不适用于生产。这很奇怪,因为所有其他代码都有效(或似乎)。
整个错误如下:
致命错误:在不在对象上下文中时使用$ 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");
有谁知道为什么会这样?
答案 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版本不同,这个问题没有引起注意。