Закрытый метод наследования 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?

2 ответа

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

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

Что-то еще, чтобы рассмотреть. Если вы хотите увидеть что-то похожее на поведение, которое вы изначально ожидали, вы можете сделать y() защищенным, а не private. При этом защищенный метод в классе 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
Другие вопросы по тегам