1
class A
{
    public function x()
    {
        echo "Public function in class A<br />";
    }
    private function y()
    {
        echo "Private function in class A<br />";
    }
    public function expose()
    {
        $this->x();
        $this->y();
    }
}

class B extends A
{
    public function x()
    {
        echo "Public function in class B<br />";
    }
    private function y()
    {
        echo "Private function in class B<br />";
    }
}
$y = new A;
$y->expose();

$z = new B;
$z->expose();

クラス A のインスタンス化により、次の結果が生成されます。「クラス A のパブリック関数 クラス A のプライベート関数」

クラス B のインスタンス化により、次の結果が生成されます。「クラス B のパブリック関数 クラス A のプライベート関数」

クラスBのインスタンス化の結果を説明できる人はいますか? クラスAの親メソッドではなく、「B」のプライベートメソッドを呼び出すべきではありませんか?

4

2 に答える 2

4

これは、プライベート メンバーを継承できないためです。

クラスにはメソッドが定義されBていないため、独自のプライベートメソッドを呼び出す のメソッドを呼び出します。expose()Ay()

于 2013-02-09T03:48:53.937 に答える
1

他に考慮すべきことがあります。当初期待していた動作に似たものを見たい場合は、y() を非公開ではなく保護することができます。これにより、クラス B の保護されたメソッドがクラス A のメソッドから見えるようになり、期待どおりにクラス be メソッドが実行されます。ただし、クラス A および B の保護されたメソッドは、$z->y(); のような外部呼び出しからアクセスできないままです。

class A
{
    public function x()
    {
        echo "Public function in class A<br />";
    }
    protected function y()
    {
        echo "Protected function in class A<br />";
    }
    public function expose()
    {
        $this->x();
        $this->y();
    }
}

class B extends A
{
    public function x()
    {
        echo "Public function in class B<br />";
    }
    protected function y()
    {
        echo "Protected function in class B<br />";
    }
}
$y = new A;
$y->expose();

$z = new B;
$z->expose();

結果は次のとおりです。

Public function in class A
Protected function in class A
Public function in class B
Protected function in class B
于 2014-06-16T00:30:02.333 に答える