PHP 致命错误:不在对象上下文中时使用$this

2022-08-30 06:37:01

我有一个问题:

我正在编写一个没有框架的新WebApp。

在我的索引中.php我使用:require_once('load.php');

加载中.php我用来加载我的类.phprequire_once('class.php');

在我的课堂上.php我遇到了这个错误:

致命错误:当不在类中的对象上下文中时使用$this.php在线...(在此示例中,它将是 11)

我的类.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;
    }
}

在我的索引中.php我正在加载,可能是这样的:foobarfunc()

foobar::foobarfunc();

但也可以是

$foobar = new foobar;
$foobar->foobarfunc();

为什么会出现错误?


答案 1

在我的索引中.php我正在加载可能是foobarfunc(),如下所示:

 foobar::foobarfunc();  // Wrong, it is not static method

但也可以是

$foobar = new foobar;  // correct
$foobar->foobarfunc();

不能以这种方式调用该方法,因为它不是静态方法。

foobar::foobarfunc();

您应该改用:

$foobar->foobarfunc();

但是,如果您已经创建了一个静态方法,如下所示:

static $foo; // your top variable set as static

public static function foobarfunc() {
    return self::$foo;
}

那么你可以使用这个:

foobar::foobarfunc();

答案 2

您正在调用一个非静态方法:

public function foobarfunc() {
    return $this->foo();
}

使用静态调用 :

foobar::foobarfunc();

使用静态调用时,将调用该函数(即使未声明为静态),但是,由于没有对象的实例,因此没有 。$this

所以:

  • 不应对非静态方法使用静态调用
  • 静态方法(或静态调用的方法)不能使用$this,这通常指向类的当前实例,因为使用静态调用时没有类实例。


在这里,类的方法使用类的当前实例,因为它们需要访问类的属性。$foo

这意味着您的方法需要该类的实例 - 这意味着它们不能是静态的。

这意味着你不应该使用静态调用:你应该实例化类,并使用对象来调用方法,就像你在代码的最后一部分所做的那样:

$foobar = new foobar();
$foobar->foobarfunc();


欲了解更多信息,请随时阅读PHP手册:


另请注意,您的方法中可能不需要此行:__construct

global $foo;

使用 global 关键字将使在所有函数和类外部声明的变量从该方法内部可见...你可能没有这样的变量。$foo$foo

要访问 class-property,您只需要使用 ,就像您所做的那样。$foo$this->foo


推荐