function - PHP Fatal error: Using $this when not in object context

I've got a problem:
I'm writing a new WebApp without a Framework.
In my index.php I'm using:require_once('load.php');
And in load.php I'm usingrequire_once('class.php');
to load my class.php.
In my class.php I've got this error:
Fatal error: Using $this when not in object context in class.php on line ... (in this example it would be 11)
An example how my class.php is written:
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
In my index.php I'm loading maybefoobarfunc()
like this:
foobar::foobarfunc();
but can also be
$foobar = new foobar;
$foobar->foobarfunc();
Why is the error coming?
Answer
Solution:
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 method this way because it is not 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 foo() {
return self::$foo;
}
then you can use this:
foobar::foobarfunc();
Answer
Solution:
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 asstatic
), 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;
To access the$foo
class-property, you only need to use$this->foo
, like you did.
Answer
Solution:
If you are invokingfoobarfunc
with resolution scope operator (::
), then you are calling it statically, e.g. on the class level instead of the instance level, thus you are using$this
when not in object context.$this
does not exist in class context.
If you enableE_STRICT
, PHP will raise a Notice about this:
Strict Standards:
Non-static method foobar::foobarfunc() should not be called statically
Do this instead
$fb = new foobar;
echo $fb->foobarfunc();
On a sidenote, I suggest not to useglobal
inside your classes. If you need something from outside inside your class, pass it through the constructor. This is called Dependency Injection and it will make your code much more maintainable and less dependant on outside things.
Answer
Solution:
First you understand one thing, $this inside a class denotes the current object.
That is which is you are created out side of the class to call class function or variable.
So when you are calling your class function like foobar::foobarfunc(), object is not created. But inside that function you written return $this->foo(). Now here $this is nothing. Thats why its saying Using $this when not in object context in class.php
Solutions:
Create a object and call foobarfunc().
Call foo() using class name inside the foobarfunc().
Answer
Solution:
Fast method : (new foobar())->foobarfunc();
You need to load your class replace :
foobar::foobarfunc();
by :
(new foobar())->foobarfunc();
or :
$Foobar = new foobar();
$Foobar->foobarfunc();
Or make static function to usefoobar::
.
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
Answer
Solution:
It seems to me to be a bug in PHP. The error
'Fatal error: Uncaught Error: Using $this when not in object context in'
appears in the function using$this
, but the error is that the calling function is using non-static function as a static. I.e:
Class_Name
{
function foo()
{
$this->do_something(); // The error appears there.
}
function do_something()
{
///
}
}
While the error is here:
Class_Name::foo();
Answer
Solution:
$foobar = new foobar;
put the class foobar in $foobar, not the object. To get the object, you need to add parenthesis:$foobar = new foobar();
Your error is simply that you call a method on a class, so there is no$this
since$this
only exists in objects.
Answer
Solution:
Just use the Class method using thisfoobar->foobarfunc();
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: the requested url was not found on this server. xampp
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.