PHPの致命的なエラー:オブジェクトコンテキストにない場合の$ thisの使用


137

私は問題を抱えています:

フレームワークなしで新しい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();

エラーが発生するのはなぜですか?


2
偶然にも、私は昨日このエラーに約3時間苦労していました!:)
ジャック

回答:


184

私の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 foo() {
    return self::$foo;
}

その後、これを使用できます:

foobar::foobarfunc();

1
同じ名前の変数は問題ではありません。$this->fooはクラスメンバー$fooですが、関数スコープ内の単なる変数です(グローバルスコープからインポートされます)。メンバーと同じ名前の関数名も問題ではありません。
ゴードン

157
$this静的メソッドでは使用できません。
Yacoby

5
それにもかかわらず、完全に間違った回答がどのように賛成票を投じるかはおかしいです。$ thisはクラスコンテキストでは使用できません。OPは上記の例と同じエラーを受け取ります。
ゴードン

4
@Sarfraz犯罪はありませんが、それでも間違っています。を使用してインスタンスメソッドを呼び出すことができます::。それは反対しているE_STRICTが、それはない長いメソッド本体は、例えば用途インスタンスのスコープを参照しないようとして仕事を$this。また、self::fooポイントしません$this->foo。クラス定数を参照します。両方、self::fooおよびself::$foo致命的なエラーが発生します。
ゴードン

3
@Sarfrazそれは今より良いです。ごめんなさい、申し訳ありませんが、これが受け入れられた答えになったので、私はこれらのことを指摘する必要があると感じました:)あなたの忍耐に感謝します。
Gordon

27

非静的メソッドを呼び出しています:

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

static-callを使用する:

foobar::foobarfunc();

static-callを使用すると、関数は呼び出されます(として宣言されていない場合でもstaticが、オブジェクトのインスタンスがないため、はありません$this

そう :

  • 非静的メソッドには静的呼び出しを使用しないでください
  • 静的呼び出し(または静的に呼び出されるメソッド)は$ thisを使用できません。これは通常、静的呼び出しを使用しているときにクラスインスタンスがないため、クラスの現在のインスタンスを指します。


ここでは、クラスのメソッドは、クラスの$fooプロパティにアクセスする必要があるため、クラスの現在のインスタンスを使用しています。

つまり、メソッドにはクラスのインスタンスが必要です。つまり、静的にすることはできません。

つまり、静的な呼び出しは使用しないでください。コードの最後の部分で行ったように、クラスをインスタンス化し、オブジェクトを使用してメソッドを呼び出す必要があります。

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


詳細については、PHPマニュアルでお読みください。


また、__constructメソッドにこの行はおそらく必要ないことにも注意してください。

global $foo;

globalキーワードを使用すると$foo、すべての関数とクラスの外部で宣言された変数が、そのメソッドの内部から表示されます...そして、おそらくそのような$foo変数はありません。

$foo class-propertyにアクセスするには$this->foo、以前と同じようにを使用するだけです。


11

あなたが起動している場合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クラス内では使用しないことをお勧めします。クラス内の外部から何かが必要な場合は、コンストラクタに渡します。これは依存性注入と呼ばれ、コードをはるかに保守しやすく、外部のものに依存しにくくなります。


6

最初にあなたは一つのことを理解します、 ます。クラス内の$ thisは、現在のオブジェクトを示します
つまり、クラスの関数または変数を呼び出すために、クラスの外で作成されます。

したがって、foobar :: foobarfunc()などのクラス関数を呼び出している場合、オブジェクトは作成されません。しかし、あなたが書いたその関数の中で$ this-> foo()を返します。ここで$ thisは何もありません。それが、class.phpのオブジェクトコンテキストにないときに$ thisを使用すると言っている理由です。

ソリューション:

  1. オブジェクトを作成し、foobarfunc()を呼び出します。

  2. foob​​arfunc()内のクラス名を使用してfoo()を呼び出します。


2
または単に$ thisの代わりに使用::
Motassem MK '25

4

静的コンテキストで関数を呼び出す場合、$this単に存在しません。

this::xyz()代わりに使用する必要があります。

関数を静的とオブジェクトインスタンスの両方で呼び出すことができるときに、どのコンテキストにいるかを確認するには、この質問で優れたアプローチの概要を説明します。


4

高速な方法:(new foobar())-> foobarfunc();

クラスreplaceをロードする必要があります。

foobar::foobarfunc();

沿って :

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

または:

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

または使用する静的関数を作成しますfoobar::

class foobar {
    //...

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

0

$foobar = new foobar;置くクラス $ foob​​arという、foobarのではないオブジェクト。オブジェクトを取得するには、括弧を追加する必要があります。$foobar = new foobar();

あなたのように、エラーを何もあり、あなたはクラスのメソッドを呼び出すことだけではありません$thisので、$thisオブジェクトのみに存在します。


0

PHPのバグのようです。エラー

「致命的なエラー:キャッチされていないエラー:オブジェクトコンテキストにないときに$ thisを使用しています」

を使用して関数に表示され$thisますが、エラーは呼び出し側の関数が非静的関数を静的として使用していることです。すなわち:

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

エラーはここにあります:

Class_Name::foo();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.