Получить свойство родительского класса

Как явно обратиться в свойству родительского класса? Например:

class Parent
{
   protected $str = 'Hello';
   ...
}

class Child extends Parent
{
   private $str = 'World';

   public function run()
   {
     echo $this->str;

     * В этом случае выведется "World"
     * Как мне вывести свойство родительского класса, если названия свойств совпадают в классах?
     * Т.е. как мне вывести переменную со значением "Hello"
     * Если в дочернем классе не создавать переменную $str, то выведется "Hello"
     * Как это связывание называется и где можно почитать? P.S слышал что-то про позднее статическое связывание, но это не относится к этому наверно
   }
}



Ответы (2 шт):

Автор решения: Ivan Dudarev

Если Вам нужно получить свойство родительского класса, не следует его переопределять в дочернем. А называется это, как ни странно, наследование

→ Ссылка
Автор решения: Макс Максимус

Не совсем понятно, зачем необходимо реализовать такую задумку, но это возможно, например, с помощью рефлексии: https://www.php.net/manual/ru/book.reflection.php. Для решения вашей задачи модно сделать следующее. Перенесем метод run() в родительский класс:

class ParentClass
{
   private $str = 'Hello';

   public function run()
   {
        echo $this->str;
    }
}

class ChildClass extends ParentClass
{
   private $str = 'World';

}

Далее воспользуемся Reflection API:

// узнаем, есть ли у нашего класса родитель и если есть, то
// получаем его имя
$class = new ReflectionClass('ChildClass');
$parent = $class->getParentClass();
if($parent) {
    $parent = $parent->name;
}
var_dump($parent); // string(11) "ParentClass" 

// Далее мы  можем исследжовать свойства родительского класса
$class = new ReflectionClass($parent);
$property = $class->getProperty('str');
echo $property->name; // str

// Т.е. теперь мы узнали, что у родительского класса тоже есть свойство $str
// и мы можем брать и использовать именно его значения для дальнейших манипуляций 
echo (new $parent)->run(); // Hellow 

Единственно, имейте ввиду, что рефлексия требует больше ресурсов, поэтому ей не следует пользоваться без особой надобности.

→ Ссылка