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

我有一个问题:

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

在我的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(); 

为什么会出现错误?

在我的index.php我加载也许foobarfunc()像这样:

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

但也可以

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

你不能这样调用方法,因为它不是静态方法。

 foobar::foobarfunc(); 

你应该使用:

 foobar->foobarfunc(); 

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

 static $foo; // your top variable set as static public static function foo() { return self::$foo; } 

那么你可以使用这个:

 foobar::foobarfunc(); 

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

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

使用静态调用:

 foobar::foobarfunc(); 

当使用静态调用时,函数将被调用(即使没有声明为static ,但是,由于没有对象的实例,所以没有$this

所以:

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

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

这意味着你的方法需要一个类的实例 – 这意味着它们不能是静态的。

这意味着你不应该使用静态调用:你应该instanciate类,并使用该对象调用方法,就像你在你的代码的最后一部分:

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

有关更多信息,请不要犹豫,在PHP手册中阅读:

  • 类和对象部分
  • 和“ 静态关键字”页面。

另外请注意,你的__construct方法中可能不需要这一行:

 global $foo; 

使用global关键字将使$foovariables,在所有函数和类之外声明,从该方法中visibile …而且您可能没有这样的$foovariables。

要访问$foo 类属性 ,只需要使用$this->foo ,就像你一样。

如果你使用parsing范围操作符 ( :: 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(); 

在旁注中,我build议不要在课堂上使用global 。 如果你需要从外部的东西,通过构造函数。 这就是所谓的dependency injection ( Dependency Injection) ,它会使你的代码更易于维护,而且更less依赖于外部事物。

首先,你明白一件事, $这里面的一个类表示当前的对象
那就是你在类的外面创build了哪个类来调用类的函数或variables。

所以当你调用你的类函数foobar :: foobarfunc()时,不会创build对象。 但是在你写的函数里面返回$ this-> foo()。 现在这里$这是没有什么。 这就是为什么说它使用$ this,而不是在class.php中的对象上下文

解决scheme:

  1. 创build一个对象并调用foobarfunc()。

  2. 在foobarfunc()中使用类名调用foo()。

当你在一个静态的上下文中调用这个函数时, $this根本就不存在。

你将不得不使用this::xyz()来代替。

为了找出在静态和对象实例中调用函数时所处的上下文,在这个问题中列出了一个很好的方法: 如何判断我是静态对象还是对象?

快速的方法:( 新的foobar()) – > foobarfunc();

你需要加载你的类replace:

 foobar::foobarfunc(); 

通过:

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

要么 :

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

或者使静态函数使用foobar::

 class foobar { //... static function foobarfunc() { return $this->foo(); } } 

$foobar = new foobar; foob​​ar放在$ foobar中, 而不是对象 。 要获取对象,需要添加括号: $foobar = new foobar();

你的错误只是你调用一个类的方法,所以没有$this因为$this只存在于对象中。

很简单 : ..!

只需在你的property和你的function之前插入static ;

使用这个foobar->foobarfunc();