web-dev-qa-db-ja.com

PHP致命的なエラー:オブジェクトコンテキストにないときに$ thisを使う

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

私はフレームワークなしで新しいWebアプリケーションを書いています。

私のindex.phpを使っています:require_once('load.php');

そしてload.phpで私はclass.phpをロードするのにrequire_once('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();

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

117
ahmet2106

私の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();
155
Sarfraz

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

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

静的呼び出しを使用します。

foobar::foobarfunc();

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

そう :

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


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

これはあなたのメソッドがクラスのインスタンスを必要とすることを意味します - それはそれらが静的であることができないことを意味します。

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

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


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


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

global $foo;

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

$fooclass-property にアクセスするには、$this->fooを使うだけでいいのです。

23
Pascal MARTIN

もしfoobarfuncresolution scope operator::)で呼び出しているのなら、あなたはそれを 静的に と呼んでいます。インスタンスレベルではなくクラスレベルで、つまりあなたはオブジェクトコンテキストにないときは$thisを使うです。 $thisはクラスコンテキストには存在しません。

E_STRICTを有効にすると、PHPはこれに関する通知を出します。

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

代わりにこれをしてください

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

補足として、クラス内でglobalを使用しないことをお勧めします。クラスの内部から何かが必要な場合は、それをコンストラクタに渡します。これは Dependency Injection と呼ばれ、コードをはるかに保守しやすく、外部の事柄への依存度を低くします。

11
Gordon

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

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

解決策:

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

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

6
Ramasamy Kasi

高速メソッド:(new foobar()) - > foobarfunc();

あなたはあなたのクラスをロードする必要があります:

foobar::foobarfunc();

によって:

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

または

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

あるいはfoobar::を使うようにstatic関数にしてください。

class foobar {
    //...

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

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

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

関数が静的にもオブジェクトインスタンス内でも呼び出すことができるときにどのようなコンテキストにいるのかを知るために、この質問では良い方法を概説します。 '静的か、オブジェクトですか?

4
Pekka 웃

$foobar = new foobar; put クラス foobarを$ foobarに入れるオブジェクトではないオブジェクトを取得するには、括弧を追加する必要があります。$foobar = new foobar();

あなたのエラーは単にあなたがクラスのメソッドを呼ぶということです、それで$thisはオブジェクトに存在するだけなので$thisはありません。

0
e-satis