Частный метод наследования класса php не вызывается должным образом в дочернем (расширенном) классе

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? Разве он не должен вызывать частный метод "B", а не родительский метод класса A?


person Robert Rocha    schedule 09.02.2013    source источник


Ответы (2)


Это потому, что частные члены не могут быть унаследованы.

В вашем классе B не определен метод expose(), поэтому он будет вызывать метод A, который вызывает собственный закрытый метод y().

person nice ass    schedule 09.02.2013

Что-то еще рассмотреть. Если вы хотите увидеть что-то похожее на поведение, которое вы изначально ожидали, вы можете сделать 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
person Gray Kales    schedule 16.06.2014