3
class Bar{        
    public function test(){
        $this->testPublic();
        $this->testPrivate();
    }

    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();
//Foo::testPublic
//Bar::testPrivate

この出力を理解するのに多くの問題があります。誰かが私に何が起こっているのかを明確に簡潔に説明することができるでしょうか?私はOOPを学んでいて、拡張機能を使用して親クラスの関数をオーバーライドする方法を知りたいと思っていました。

4

2 に答える 2

5

このtest()メソッドは2つのメソッドを呼び出します。

  1. testPublic-公開されているため、でオーバーライドされましたFoo。だからFoo::testPublicと呼ばれる
  2. testPrivate-プライベートなものなので、各クラス自体にのみ表示されます。呼び出し元メソッドの場合(それはBar)-それはBar::testPrivate

したがって、-メソッドがpublicまたはprotected-の場合、それをオーバーライドして、祖先/子から呼び出すことができます。もしそうならprivate-それはできません。

于 2013-01-16T20:26:40.833 に答える
0

$ thisは、現在のオブジェクトを参照します。したがって、次のことを行うと。

$ this-> testPublic();

その関数を実装する最上位のクラスに対してtestPublic()を呼び出します。

親クラスのみを呼び出したい場合は、parentキーワードがあります。

parent :: testPublic();

これにより、現在のオブジェクトののクラスでtestPublic()が呼び出されます。

->演算子と::演算子を混同しないように十分注意してください。

::演算子はオブジェクトのクラス定義を参照しますが、as->はオブジェクトのインスタンスを参照します。

 self::testPublic();
 $foo::testPublic();

これはtestPublic()と呼ばれる静的関数を参照し、静的メソッドはクラスレベルで定義されます。

 $foo->testPublic();
 $this->testPublic();

これは、オブジェクトのインスタンスの一部として関数を参照し、どのオブジェクトインスタンスレベルを呼び出す必要があるかを検索するために使用されるvtableがあります。

于 2013-01-16T20:28:30.390 に答える