PHP致命错误:不在对象上下文中使用$this
我有个问题: 我正在写一个没有框架的新WebApp 在我的index.php中,我使用:PHP致命错误:不在对象上下文中使用$this,php,function,class,object,fatal-error,Php,Function,Class,Object,Fatal Error,我有个问题: 我正在写一个没有框架的新WebApp 在我的index.php中,我使用:require_once('load.php') 在load.php中,我使用了require_once('class.php')加载我的class.php 在我的class.php中,我遇到了以下错误: 致命错误:当不在class.php的对象上下文中时,在第行使用$this。。。(本例中为11) my class.php的编写示例如下: class foobar { public $foo;
require_once('load.php')代码>
在load.php中,我使用了require_once('class.php')
加载我的class.php
在我的class.php中,我遇到了以下错误:
致命错误:当不在class.php的对象上下文中时,在第行使用$this。。。(本例中为11)
my class.php的编写示例如下:
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
在我的index.php中,我加载的可能是foobarfunc()
,如下所示:
foobar::foobarfunc();
但也可以是
$foobar = new foobar;
$foobar->foobarfunc();
为什么会出现错误
在我的index.php中,我可能正在加载
foobarfunc()如下所示:
foobar::foobarfunc();
但也可以是
$foobar = new foobar;
$foobar->foobarfunc();
您不能以这种方式调用方法,因为它不是静态方法
foobar::foobarfunc();
您应改为使用:
foobar->foobarfunc();
但是,如果您创建了一个静态方法,例如:
static $foo; // your top variable set as static
public static function foo() {
return self::$foo;
}
然后你可以使用这个:
foobar::foobarfunc();
如果您使用(:
)调用foobarfunc
,那么您正在调用它,例如在类级别而不是实例级别上调用它,因此当不在对象上下文中时,您正在使用$this
<代码>$this
在类上下文中不存在
如果启用E_STRICT
,PHP将对此发出通知:
Strict Standards:
Non-static method foobar::foobarfunc() should not be called statically
改为这样做
$fb = new foobar;
echo $fb->foobarfunc();
另外,我建议不要在类中使用
global
。如果您需要从类的外部或内部获取某些内容,请将其传递给构造函数。调用此函数将使您的代码更易于维护,更少地依赖外部事物。当您在静态上下文中调用函数时,$This
根本不存在
您必须改用this::xyz()
要了解可以静态调用函数和在对象实例中调用函数时所处的环境,在这个问题中介绍了一种很好的方法:您正在调用非静态方法:
public function foobarfunc() {
return $this->foo();
}
使用静态调用:
foobar::foobarfunc();
使用静态调用时,将调用函数(即使未声明为静态
),但由于没有对象实例,因此没有$this
因此:
- 您不应该对非静态方法使用静态调用
- 静态方法(或静态调用的方法)不能使用$this,它通常指向类的当前实例,因为在使用静态调用时没有类实例
在这里,类的方法使用类的当前实例,因为它们需要访问类的
$foo
属性
这意味着您的方法需要类的实例——这意味着它们不能是静态的
这意味着您不应该使用静态调用:您应该实例化类,并使用对象调用方法,就像您在代码的最后一部分中所做的那样:
$foobar = new foobar();
$foobar->foobarfunc();
有关更多信息,请毫不犹豫地阅读PHP手册:
- 部门
- 还有那一页
还要注意的是,在
构造中可能不需要这一行:
global $foo;
使用将使在所有函数和类外部声明的$foo
变量从该方法内部可见。。。您可能没有这样的$foo
变量
要访问$foo
,您只需像以前一样使用$this->foo
。$foobar=new foobar代码>将类放入$foobar中,而不是对象。要获取对象,需要添加括号:$foobar=newfoobar()代码>
您的错误只是在类上调用了一个方法,因此没有$this
,因为$this
只存在于对象中。首先您了解一件事,$this在类中表示当前对象
也就是说,您是在类的外部创建的,用于调用类函数或变量
所以,当您调用类函数(如foobar::foobarfunc())时,不会创建对象。
但在这个函数中,您编写了return$this->foo()。现在给你,这算不了什么。这就是为什么在class.php中不在对象上下文中时使用$this
解决方案:
创建一个对象并调用foobarfunc()
在foobarfunc()中使用类名调用foo()
只需使用这个foobar->foobarfunc()的Class方法代码>快速方法:(new foobar())->foobarfunc();
您需要加载类替换:
foobar::foobarfunc();
作者:
或:
或者使静态函数使用foobar::
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
在我看来,这似乎是PHP中的一个bug。
错误
'致命错误:未捕获错误:不在对象上下文中时使用$this
在'
出现在使用$this
的函数中,但错误是调用函数将非静态函数用作静态函数。即:
Class_Name
{
function foo()
{
$this->do_something(); // The error appears there.
}
function do_something()
{
///
}
}
错误就在这里:
Class_Name::foo();
具有相同名称的变量不是问题$this->foo
是类成员,而$foo
只是函数范围中的一个变量(从全局范围导入)。与成员同名的函数名也不是问题。您不能在静态方法中使用$this
。有趣的是,一个完全错误的答案竟然会出现$这在类上下文中不可用。OP将从上面的例子中得到相同的错误。@Sarfraz无意冒犯,但它仍然是错误的。您可以使用:
调用实例方法。它反对E\u STRICT
,但只要方法体不引用实例范围,它就可以工作,例如使用$this
。另外,self::foo
不会指向$this->foo
。它引用一个类常量。self::foo
和self::$foo
都会引发致命错误。@Sarfraz现在好多了。对不起打扰你了,
Class_Name
{
function foo()
{
$this->do_something(); // The error appears there.
}
function do_something()
{
///
}
}
Class_Name::foo();