У меня есть небольшая проблема с некоторым кодом, который работает на разработке, но не на производстве. Это странно, потому что весь другой код работает (или кажется).
Вся ошибка заключается в следующем:
Неустранимая ошибка: использование $ this, когда не в контексте объекта в
/[snip]/application/modules/manage_plugins/models/Manage_plugins.php
в строке 6 Обнаружена ошибка PHPСерьезность: ошибка
Сообщение: использование $ this, когда не в контексте объекта
Имя файла: models / Manage_plugins.php
Номер строки: 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 я смог обойти эту проблему и заставить аналогичную структуру работать на PHP 5.3 use
копия объекта $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");
}
}
Проблема возникла потому, что в версиях PHP до 5.4, $this
не был доступен в анонимных функциях.
5.4.0 — Анонимные функции могут использовать $ this, а также быть объявлены статически
Источник: http://php.net/manual/en/functions.anonymous.php
Эта проблема осталась незамеченной из-за различий в версиях PHP для разработки (5.5) и производства (5.3).
Смотрите также: https://stackoverflow.com/a/19432335/3649573
Других решений пока нет …