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

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

我有个问题:

我正在编写一个没有框架的新网络应用程序。

在我的index.php我用的是:require_once('load.php');

和在load.php我在用require_once('class.php');加载我的class.php.

在我的class.php我有个错误:

致命错误:在class.php中未在对象上下文中在线使用$this.(在本例中为11)

举个例子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();

为什么会出现错误?


森林海
浏览 502回答 3
3回答

翻过高山走不出你

您正在调用一个非静态方法:public function foobarfunc() {     return $this->foo();}使用静态调用:foobar::foobarfunc();使用静态调用时,将调用该函数。(即使没有宣布为static),但是,由于没有对象的实例,所以没有$this.因此:不应对非静态方法使用静态调用。静态方法(或静态调用的方法)不能使用$this,它通常指向类的当前实例,因为在使用静态调用时没有类实例。在这里,类的方法使用类的当前实例,因为它们需要访问$foo类的属性。这意味着您的方法需要类的实例-这意味着它们不能是静态的。这意味着不应该使用静态调用:应该实例化类,并使用对象调用方法,就像在代码的最后一部分中所做的那样:$foobar = new foobar();$foobar->foobarfunc();欲了解更多信息,请参阅PHP手册中的内容:这个类和对象剖面而静态关键字一页。还请注意,您可能不需要在您的__construct方法:global $foo;使用global关键词会使$foo变量,在所有函数和类的外部声明,从该方法中提取.而且你可能没有$foo变量。访问$foo 类属性,您只需使用$this->foo就像你一样。

大话西游666

如果您正在调用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在你的教室里。如果您需要类内的外部内容,请通过构造函数传递它。这叫做依赖注入它将使您的代码更易于维护,更不依赖于外部事物。
打开App,查看更多内容
随时随地看视频慕课网APP