私は問題を抱えています:
私はフレームワークなしで新しい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();
エラーが発生するのはなぜですか?
私の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();
あなたは非静的メソッドを呼び出しています:
public function foobarfunc() {
return $this->foo();
}
静的呼び出しを使用します。
foobar::foobarfunc();
静的呼び出しを使用する場合、関数は(static
として宣言されていなくても)と呼ばれますが、オブジェクトのインスタンスがないため、$this
はありません。
そう :
ここでは、クラスのメソッドは、クラスの$foo
プロパティにアクセスする必要があるため、クラスの現在のインスタンスを使用しています。
これはあなたのメソッドがクラスのインスタンスを必要とすることを意味します - それはそれらが静的であることができないことを意味します。
つまり、静的呼び出しを使用しないでください。最後のコード部分で行ったように、クラスをインスタンス化し、オブジェクトを使用してメソッドを呼び出す必要があります。
$foobar = new foobar();
$foobar->foobarfunc();
詳細については、PHPのマニュアルをお読みください。
また、__construct
メソッドではこの行はおそらく必要ないことに注意してください。
global $foo;
global
キーワード を使用すると、すべての関数とクラスの外側で宣言された$foo
変数がそのメソッドの内側から表示されます。そして、おそらくそのような$foo
変数はありません。
$foo
class-property にアクセスするには、$this->foo
を使うだけでいいのです。
もしfoobarfunc
を resolution 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 と呼ばれ、コードをはるかに保守しやすく、外部の事柄への依存度を低くします。
最初に理解したことですが、クラス内の$ thisは現在のオブジェクトを表します。
これは、クラス関数または変数を呼び出すためにクラス外で作成されたものです。
そのため、foobar :: foobarfunc()のようにクラス関数を呼び出しても、オブジェクトは作成されません。しかし、その関数の中であなたが書いたものは$ this-> foo()を返します。今ここで$これは何もないです。なぜそれが言っているのでしょうclass.phpのオブジェクトコンテキストではないときに$ thisを使う
解決策:
オブジェクトを作成してfoobarfunc()を呼び出します。
Foobarfunc()内でクラス名を使用してfoo()を呼び出します。
あなたはあなたのクラスをロードする必要があります:
foobar::foobarfunc();
によって:
(new foobar())->foobarfunc();
または
$Foobar = new foobar();
$Foobar->foobarfunc();
あるいはfoobar::
を使うようにstatic関数にしてください。
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
静的なコンテキストで関数を呼び出すとき、$this
は単に存在しません。
代わりにthis::xyz()
を使用する必要があります。
関数が静的にもオブジェクトインスタンス内でも呼び出すことができるときにどのようなコンテキストにいるのかを知るために、この質問では良い方法を概説します。 '静的か、オブジェクトですか?
$foobar = new foobar;
put クラス foobarを$ foobarに入れるオブジェクトではないオブジェクトを取得するには、括弧を追加する必要があります。$foobar = new foobar();
あなたのエラーは単にあなたがクラスのメソッドを呼ぶということです、それで$this
はオブジェクトに存在するだけなので$this
はありません。