2012-02-24 13 views
2

私はいつも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$myFooBarのインスタンスでない限り)を呼び出さないと思った。私は$thisget_classとテストしました。Bar::testPrivateBar::testの内部からでも、常にFooを返します。しかし、$thisBar::test$this->testPrivate()を呼び出すとBarのインスタンスのように振る舞います。

これは本当に混乱していて、私は理解しようとしていますなぜそれはそのように動作します!

私は継承されたメソッド(publicまたはprotected)が何らかの形で基底クラスから子クラスにコピーされたと考えました。プライベートメソッドはまったくコピーされませんでした。しかし、この例は、このように動作しないことを示しています。 Fooのインスタンスが内部インスタンスBarを保持し、必要に応じてメソッド呼び出しを委譲するように見えます。

私はここで何かを学ぼうとしています。私は物事が私に合っていることを知るだけです。これはしません。このすべてを書いた後、私は二つの質問でそれをまとめることができると思います。

  1. 誰かが簡単に継承がPHPの内部をどのように動作するかを説明してもらえますか?あるいは、少なくとも、記事やドキュメンテーションについて教えてください。

  2. ここで議論されている動作または$thisは他のOO言語にも存在するのですか、それともPHP固有のものですか?

答えて

関連する問題