私はいつもOOPの仕組みを理解していると思っていましたが、何年もそれを使っていましたが、時には私にはあまり明確ではないコンセプトもあります。
私はちょうどthis questionに、PHPのメソッドの可視性について尋ねました。 accepted answerは、プライベートメソッドをPHPの子クラスでオーバーライドできないことを説明しています。さて、それは理にかなっています。しかし、この例では、PHPの内部継承メカニズムについて考えさせてくれました。また、$this
は継承されたメソッドで動作します。
(また、上記の質問に含まexample from the PHP Manual、)このコードを考えてみましょう:
擬似変数$ときの方法このが提供されています:
class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); /* Output: Bar::testPrivate Foo::testPublic */
は今、このexcerpt from the PHP Manualを考えますオブジェクトコンテキスト内から呼び出されます。 $ thisは呼び出し元オブジェクトへの参照です(通常、メソッドが属するオブジェクトですが、メソッドがセカンダリオブジェクトのコンテキストから静的に呼び出された場合は別のオブジェクトも可能です)。
「$this
は、呼び出し対象オブジェクトへの参照です。」は$myFoo
です。だから、私は$myFoo->test()
が常にFoo::testPrivate
を呼び出し、Bar::testPrivate
($myFoo
がBar
のインスタンスでない限り)を呼び出さないと思った。私は$this
をget_class
とテストしました。Bar::testPrivate
とBar::test
の内部からでも、常にFoo
を返します。しかし、$this
はBar::test
が$this->testPrivate()
を呼び出すとBar
のインスタンスのように振る舞います。
これは本当に混乱していて、私は理解しようとしていますなぜそれはそのように動作します!
私は継承されたメソッド(public
またはprotected
)が何らかの形で基底クラスから子クラスにコピーされたと考えました。プライベートメソッドはまったくコピーされませんでした。しかし、この例は、このように動作しないことを示しています。 Foo
のインスタンスが内部インスタンスBar
を保持し、必要に応じてメソッド呼び出しを委譲するように見えます。
私はここで何かを学ぼうとしています。私は物事が私に合っていることを知るだけです。これはしません。このすべてを書いた後、私は二つの質問でそれをまとめることができると思います。
誰かが簡単に継承がPHPの内部をどのように動作するかを説明してもらえますか?あるいは、少なくとも、記事やドキュメンテーションについて教えてください。
ここで議論されている動作または
$this
は他のOO言語にも存在するのですか、それともPHP固有のものですか?