Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP致命错误:不在对象上下文中使用$this_Php_Function_Class_Object_Fatal Error - Fatal编程技术网

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

PHP致命错误:不在对象上下文中使用$this,php,function,class,object,fatal-error,Php,Function,Class,Object,Fatal Error,我有个问题: 我正在写一个没有框架的新WebApp 在我的index.php中,我使用:require_once('load.php') 在load.php中,我使用了require_once('class.php')加载我的class.php 在我的class.php中,我遇到了以下错误: 致命错误:当不在class.php的对象上下文中时,在第行使用$this。。。(本例中为11) my class.php的编写示例如下: class foobar { public $foo;

我有个问题:

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

在我的index.php中,我使用:
require_once('load.php')

load.php中,我使用了
require_once('class.php')
加载我的class.php

在我的class.php中,我遇到了以下错误:

致命错误:当不在class.php的对象上下文中时,在第行使用$this。。。(本例中为11)

my 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();
但也可以是

$foobar = new foobar;
$foobar->foobarfunc();
您不能以这种方式调用方法,因为它不是静态方法

foobar::foobarfunc();
您应改为使用:

foobar->foobarfunc();
但是,如果您创建了一个静态方法,例如:

static $foo; // your top variable set as static

public static function foo() {
    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();
使用静态调用时,将调用函数(即使未声明为
静态
),但由于没有对象实例,因此没有
$this

因此:

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

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

这意味着您的方法需要类的实例——这意味着它们不能是静态的

这意味着您不应该使用静态调用:您应该实例化类,并使用对象调用方法,就像您在代码的最后一部分中所做的那样:

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

有关更多信息,请毫不犹豫地阅读PHP手册:

  • 部门
  • 还有那一页

还要注意的是,在
构造中可能不需要这一行:

global $foo;
使用将使在所有函数和类外部声明的
$foo
变量从该方法内部可见。。。您可能没有这样的
$foo
变量


要访问
$foo
,您只需像以前一样使用
$this->foo

$foobar=new foobar将类放入$foobar中,而不是对象。要获取对象,需要添加括号:
$foobar=newfoobar()


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

首先您了解一件事,$this在类中表示当前对象
也就是说,您是在类的外部创建的,用于调用类函数或变量

所以,当您调用类函数(如foobar::foobarfunc())时,不会创建对象。 但在这个函数中,您编写了return$this->foo()。现在给你,这算不了什么。这就是为什么在class.php中不在对象上下文中时使用$this

解决方案:

  • 创建一个对象并调用foobarfunc()

  • 在foobarfunc()中使用类名调用foo()


  • 只需使用这个
    foobar->foobarfunc()的Class方法

    快速方法:(new foobar())->foobarfunc(); 您需要加载类替换:

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

    具有相同名称的变量不是问题
    $this->foo
    是类成员,而
    $foo
    只是函数范围中的一个变量(从全局范围导入)。与成员同名的函数名也不是问题。您不能在静态方法中使用
    $this
    。有趣的是,一个完全错误的答案竟然会出现$这在类上下文中不可用。OP将从上面的例子中得到相同的错误。@Sarfraz无意冒犯,但它仍然是错误的。您可以使用
    调用实例方法。它反对
    E\u STRICT
    ,但只要方法体不引用实例范围,它就可以工作,例如使用
    $this
    。另外,
    self::foo
    不会指向
    $this->foo
    。它引用一个类常量。
    self::foo
    self::$foo
    都会引发致命错误。@Sarfraz现在好多了。对不起打扰你了,
    Class_Name
    {
        function foo()
        {
            $this->do_something(); // The error appears there.
        }
        function do_something()
        {
            ///
        }
    }
    
    Class_Name::foo();