У меня есть два класса — родительский «Первый» с переменной $ number, и у меня есть дочерний класс «Второй», в котором изменяется свойство $ number.
Как получить доступ к родительской переменной из дочернего объекта, если он был заменен в дочернем?
Мы не можем изменить свойства и метод, которые у нас есть сейчас.
class First {
protected $number = "First";
protected function getNumber() {
return $this->number;
}
}
class Second extends First {
protected $number = "Second";
protected $count = "One More";
}
$first = new First;
$second = new Second;
// must show "First"echo $second->getNumber();
Метод getNumber () объявлен как защищенный, поэтому ваш пример кода вызовет фатальную ошибку.
Цитировать php документы:
Члены, объявленные защищенными, могут быть доступны только внутри класса
сам по себе и по наследственным и родительским классам.
Ссылка на сайт : http://php.net/manual/en/language.oop5.visibility.php
Итак, вам сначала нужно создать свой собственный пользовательский класс, который расширяет Second, и либо переопределить метод getNumber, либо создать другой метод, который создает экземпляр родительского класса, чтобы вернуть его значение $ number. Ваш метод должен быть объявлен как открытый для возможности чтобы получить доступ к нему снаружи класса. Смотрите пример ниже:
class First {
protected $number = "First";
protected function getNumber() {
return $this->number;
}
}
class Second extends First {
protected $number = "Second";
protected $count = "One More";
}
class CustomClass extends Second {public function callSecondClassParentGetNumberMethod() {
$parentClass=get_parent_class('Second');
$parent=new $parentClass;
//or if you know the parent class just call it directly:
//$parent =new First;
return $parent->getNumber();
}
}$customClass = new CustomClass;
// shows "First"echo $customClass->callSecondClassParentGetNumberMethod();
Спасибо, matwr так много … ты делаешь мой день!
Я только что сделал небольшие изменения в вашем решении, и это прекрасно работает.
class First {
protected $number = "First";
protected function getNumber() {
return $this->number;
}
}
Второй класс расширяет Первый {
protected $number = "Second";
public function getNumber() {
$parent = new First;
return $parent->getNumber();
}
}
$ first = new First;
$ second = new Second;
// показывает «Первый» echo $ second-> getNumber ();