PHP Fatal error: Using $this when not in object context
In my index.php I'm loading maybe foobarfunc() like this:
foobar::foobarfunc(); // Wrong, it is not static method
but can also be
$foobar = new foobar; // correct
$foobar->foobarfunc();
You can not invoke the method this way because it is not a static method.
foobar::foobarfunc();
You should instead use:
$foobar->foobarfunc();
If however, you have created a static method something like:
static $foo; // your top variable set as static
public static function foobarfunc() {
return self::$foo;
}
then you can use this:
foobar::foobarfunc();
You are calling a non-static method :
public function foobarfunc() {
return $this->foo();
}
Using a static-call :
foobar::foobarfunc();
When using a static-call, the function will be called (even if not declared as static
), but, as there is no instance of an object, there is no $this
.
So :
- You should not use static calls for non-static methods
- Your static methods (or statically-called methods) can't use $this, which normally points to the current instance of the class, as there is no class instance when you're using static-calls.
Here, the methods of your class are using the current instance of the class, as they need to access the $foo
property of the class.
This means your methods need an instance of the class -- which means they cannot be static.
This means you shouldn't use static calls : you should instanciate the class, and use the object to call the methods, like you did in your last portion of code :
$foobar = new foobar();
$foobar->foobarfunc();
For more informations, don't hesitate to read, in the PHP manual :
- The Classes and Objects section
- And the Static Keyword page.
Also note that you probably don't need this line in your __construct
method :
global $foo;
Using the global
keyword will make the $foo
variable, declared outside of all functions and classes, visibile from inside that method... And you probably don't have such a $foo
variable.
To access the $foo
class-property, you only need to use $this->foo
, like you did.