3

I'm receiving this fatal error message: Using $this when not in object context. This class is setted up as a library in the CodeIgniter.

This is my class:

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

I'm initializing it via autoload.php. The line it is throwing the error at:

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

Where is my problem?

Cyclone
  • 14,839
  • 23
  • 82
  • 114

3 Answers3

5

You can't use $this in a static method. The variable $this is only available to class methods as these receive the object on which the method is called.

That's what "when not in object context" means: there's no object passed to that static method because it's static. A static method is part of the class, not part of the objects that are instantiated using that class.

Simeon Visser
  • 118,920
  • 18
  • 185
  • 180
3

$this will not be available in a static function. You'll probably want to re-create $app within the static function:

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

I'm not quite sure what you're trying to do in the grand context of your application, but you may not even need a static method in the first place.

rjz
  • 16,182
  • 3
  • 36
  • 35
1

To be honest, the store function should be an instance function (remove static keyword), otherwise using $this within it will have no idea what object it's referring to.

Alternatively, you could have objects pass in references to themselves so that the static function would know what object to act on: static function store($obj, $key, $value) [...] $obj->app [...]

Or, just pass in the contents of $obj->app since the static function only needs that piece of information and not access to the entire object:

static function store($app, $key, $value)
{
    $key = sha1($key);
    $value = serialize($value);
    file_put_contents( $app . $key.'.cache', $value);
}
amphetamachine
  • 27,620
  • 12
  • 60
  • 72