Неисправимая модель Codeigniter: использование $ this, когда оно не в контексте объекта

У меня есть небольшая проблема с некоторым кодом, который работает на разработке, но не на производстве. Это странно, потому что весь другой код работает (или кажется).

Вся ошибка заключается в следующем:

Неустранимая ошибка: использование $ 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");

Кто-нибудь знает, почему это происходит?

0

Решение

Благодаря 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]