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

心已入冬 提交于 2019-12-25 15:23:30

问题


I have a little issue with some code that works on development but not on production. It is weird, because all the other code works (or seems to).

The entire error is the following:

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:

From the other similar issues I could find, it was due to people attempting to use "$this" in a static context - I don't believe that is the case for me.

Here is the manage_plugins constructor, with line 6 (error line) being the first in the constructor:

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");
    }

}

It is being loaded by the following code (and never called explicitly):

$CI =& get_instance();

$CI->load->model("manage_plugins/manage_plugins");

Does anyone know why this is happening?


回答1:


Thanks to rexmarc, I was able to workaround the issue and make a similar structure work on PHP 5.3 by use-ing a copy of the object $this in the anonymous function.

I changed the following:

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");
    }

}

into:

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");
    }

}

Another solution for this could have been:

class Manage_plugins extends CI_Model {
    public function __construct() {
        $this->mediator->attach("manage_load", [$this, 'on_manage_load']);

        $this->load->model("automediator");
    }

}

The issue was occurring because in PHP versions prior to 5.4, $this was not available in anonymous functions.

5.4.0 - Anonymous functions may use $this, as well as be declared statically

Source: http://php.net/manual/en/functions.anonymous.php

The issue went unnoticed because of differing PHP versions on development (5.5) and production (5.3).

See also: https://stackoverflow.com/a/19432335/3649573



来源:https://stackoverflow.com/questions/38317953/codeigniter-model-fatal-error-using-this-when-not-in-object-context

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!