161

問題があります:

フレームワークなしで新しい WebApp を作成しています。

私のindex.phpで私は使用しています:require_once('load.php');

そしてload.phpでは、 class.phprequire_once('class.php');をロードするために使用しています。

私のclass.phpでは、次のエラーが発生しました:

Fatal error: Using $this when not in object context in class.php on line ... (この例では 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();

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

4

9 に答える 9

227

私の 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();
于 2010-02-28T11:56:45.030 に答える
32

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

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

于 2010-02-28T11:58:41.627 に答える
13

解決スコープ演算子( ) を使用して呼び出している場合は、インスタンス レベルではなくクラス レベルなどで静的に呼び出している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ます。クラスの外部から何かが必要な場合は、コンストラクターを介して渡します。これは依存性注入と呼ばれ、コードの保守性が大幅に向上し、外部への依存度が低くなります。

于 2010-02-28T11:56:46.733 に答える
5

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

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

関数が静的とオブジェクト インスタンスの両方で呼び出される場合に、どのコンテキストにいるのかを調べるには、次の質問で適切なアプローチを概説します。

于 2010-02-28T11:58:28.537 に答える