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
关键字将使$foo
variables,在所有函数和类之外声明,从该方法中visibile …而且您可能没有这样的$foo
variables。
要访问$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:
-
创build一个对象并调用foobarfunc()。
-
在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;
把类 foobar放在$ foobar中, 而不是对象 。 要获取对象,需要添加括号: $foobar = new foobar();
你的错误只是你调用一个类的方法,所以没有$this
因为$this
只存在于对象中。
很简单 : ..!
只需在你的property
和你的function
之前插入static
;
使用这个foobar->foobarfunc();