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?

2
  • 2
    you're using $this in your static function, you can't do that. Commented Apr 3, 2012 at 17:17
  • I don't know why you are using a static method! I only use them in utility classes :) Commented Apr 3, 2012 at 17:23

3 Answers 3

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.

Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.