Как получить доступ к родительской переменной из дочернего объекта, если она была заменена в дочерней?

У меня есть два класса — родительский «Первый» с переменной $ 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();

0

Решение

Метод 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();
0

Другие решения

Спасибо, 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 ();

0

По вопросам рекламы [email protected]