Неустранимая ошибка: использование $ this, когда не в контексте объекта - PullRequest
3 голосов
/ 03 апреля 2012

Я получаю это фатальное сообщение об ошибке: Using $this when not in object context. Этот класс настроен как библиотека в CodeIgniter.

Это мой класс:

class My_class {

    function __construct()
    {
            $this->app = base_url('application') . '/cache/';
            if ($this->expire_after == '')
            {
                $this->expire_after = 300;
            }
    }

    static function store($key, $value)
    {
        $key = sha1($key);
        $value = serialize($value);
        file_put_contents( $this->app . $key.'.cache', $value);
    }
}

Я инициализирую его через autoload.php. Строка, в которой выдается ошибка:

file_put_contents( $this->app . $key.'.cache', $value);

Где моя проблема?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2012

Нельзя использовать $this в статическом методе. Переменная $this доступна только для методов класса, поскольку они получают объект, для которого вызывается метод.

Вот что означает «когда не в контексте объекта»: объект не передается этому статическому методу, потому что он статический. Статический метод является частью класса, а не частью объектов, которые создаются с использованием этого класса.

3 голосов
/ 03 апреля 2012

$this не будет доступно в статической функции.Возможно, вы захотите воссоздать $app в статической функции:

static function store($key, $value)
{
    $app = base_url('application') . '/cache/';
    $key = sha1($key);
    $value = serialize($value);
    file_put_contents( $app . $key.'.cache', $value);
}

Я не совсем уверен, что вы пытаетесь сделать в большом контексте вашего приложения, но вы можетедаже не нужно static метод в первую очередь.

1 голос
/ 03 апреля 2012

Если честно, функция store должна быть функцией экземпляра (ключевое слово remove static), в противном случае использование внутри нее $this не будет иметь понятия, на какой объект она ссылается.

В качестве альтернативы,Вы могли бы передавать объекты в ссылки на себя, чтобы статическая функция знала, с каким объектом действовать: static function store($obj, $key, $value) [...] $obj->app [...]

Или просто передайте содержимое $obj->app, так как статической функции нужен только этот элементинформации и не доступ ко всему объекту:

static function store($app, $key, $value)
{
    $key = sha1($key);
    $value = serialize($value);
    file_put_contents( $app . $key.'.cache', $value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...