为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
森林海 2019-06-25 15:05:39
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();为什么会出现错误?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超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就像你一样。


查看完整回答
反对 回复 2019-06-25
?
大话西游666

TA贡献1817条经验 获得超14个赞

如果您正在调用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在你的教室里。如果您需要类内的外部内容,请通过构造函数传递它。这叫做依赖注入它将使您的代码更易于维护,更不依赖于外部事物。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 501 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信