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