呼び出し元のスコープとは何ですか?
PHPでは、メソッドを呼び出すときに、オブジェクトにこのポインタを$が呼び出しスコープモーメント法は、次の例のために呼ばれています。
<?PHP はFoo :: バー(); ?>
ドメインのコンテキストで呼び出しバー法は、スコープを呼び出していない場合、これは静的な呼び出しです。
次の例を示します。
<?PHPの クラスA { パブリック 関数のテスト(){ Fooの :: バー()。 } } $のA = 新しいA(); $ A - >テスト();
コールバー法は、$オブジェクトのコンテキストで、それはこの時点では、と言うことですときに呼び出すスコープは$ターゲットであるので、これは本当に静的呼び出しではありません。
この結論を確認するために、実用的な例は、以下の点を考慮します。
<?PHPの クラスはFoo { パブリック 関数バー(){ のvar_dump($この)。 } } クラスA { パブリック 関数のテスト(){ Fooの :: バー()。 } } $のA = 新しいA(); $ A - > テスト(); ?>
どのような出力のですか?
オブジェクト(A) #1(0){ }
あなたがバーを呼び出すと、一見「静的な」それを呼び出すことはかなり静的である、オブジェクト、$ thisポインタが割り当てられ呼び出すために呼び出し、$へのポイント?
私はこの問題を説明するために、この例を与えるが、我々は実用的なアプリケーションでは、我々は、PHPは、この呼び出しのための厳格な警告を与える非静的メソッドを呼び出すために「::」の使用を避けるようにしてください:
- 厳しい基準:非静的メソッドはFoo :: bar()の互換性のないコンテキストから、これを$を想定して、スタティックにコールするべきではありません
中には、これは正しい、バグを検討すべきであると言うかもしれない?あなたはクラス期間の非静的メソッドを呼び出す「の静的な形」のコンテキストで呼び出しスコープを持っているので、実際には、より多くのは、誤った使用によって引き起こされなければなりません。
では、なぜこのような設計は、PHPには、次の例を考えてみなければならないん?:
<?PHPの クラスA { パブリック 関数__construct(){ } } クラス Bは延び{ パブリック 関数__construct(){ 親 :: __constructを(); } }
私たちは、親クラスのコンストラクタを呼び出すとき、私たちは現在のスコープに興味があるの呼び出しスコープとして親クラスのコンストラクタに渡す必要があります。
::この操作のクラスの非静的メソッドを使用するための呼び出しは間違っている、我々は::(取得のためのクラスの非静的メソッドを呼び出すための正しい方法を使用する必要があります)このメソッドは、クラスAに呼び出すことができたが非静的メソッドget()が、それはエラーメッセージを生成します。
「厳格な基準:非静的メソッドはFoo :: bar()の$と仮定すると、スタティックにコールするべきではありません、この互換性のない文脈から」
そこで、我々は正しい方法を使用して、非静的メソッドを呼び出すようにしてください。
鳥ジボオフから転送します。