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();

为什么会出错?

610548 次浏览

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

如果您使用 分辨率作用域运算符(::)调用 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。如果您需要从类的外部获取某些内容,请通过构造函数传递它。这就是所谓的 依赖注入,它将使您的代码更具可维护性,并减少对外部事物的依赖。

当您在静态上下文中调用函数时,$this根本不存在。

您必须改用 this::xyz()

为了了解在什么情况下可以同时在静态和对象实例中调用函数,在这个问题中概述了一种很好的方法: 如何判断我是静态的还是物体

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

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

全班同学 foobar 放在 $foobar,不是物品中。要获得对象,需要添加括号: $foobar = new foobar();

您的错误只是在类上调用了一个方法,所以不存在 $this,因为 $this只存在于对象中。

首先你要明白一件事,类中的 $这个表示 当前物体
也就是在类之外创建来调用类函数或变量。

因此,当您像 foobar: : foobarfunc ()这样调用类函数时,不会创建对象。 但是在这个函数中,你写了返回 $this-> foo ()。现在这里 $这没什么。这就是为什么在 class.php 的对象上下文中没有使用 $this 时,它说 < em > 使用 $this 的原因

解决方案:

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

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

只需使用使用此 foobar->foobarfunc();的 Class 方法

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

您需要加载您的类,替换:

foobar::foobarfunc();

作者:

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

或:

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

或者使 静电干扰函数使用 foobar::

class foobar {
//...


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

在我看来这是 PHP 中的一个 bug。 错误

’致命错误: 未捕获错误: 不在对象上下文中使用 $this 在里面

显示在使用 $this的函数中,但错误在于调用函数使用非静态函数作为静态函数。例如:

Class_Name
{
function foo()
{
$this->do_something(); // The error appears there.
}
function do_something()
{
///
}
}

错误就在这里:

Class_Name::foo();