class A { private $a; } class B extends A { function __construct() { (new \ReflectionClass($this))->getProperty('a')->setAccessible(true); echo $this->a; } } (new B());
это должно работать, хотя оно вызывает исключение: «property a doesnt exists». Многие статьи говорят, что отражение – это решение
Вы передаете ReflectionClass
экземпляр B
, который не имеет доступа к $a
. Вам нужно передать ему экземпляр A
вместо этого. Это должно помочь прояснить, что вам нужно сделать здесь
class A { private $a = 'Bob'; } class B extends A { function __construct() { $instance = new A(); $reflection = new \ReflectionClass($instance); $property = $reflection->getProperty('a'); $property->setAccessible(true); echo $property->getValue(new A()); } } (new B());
демонстрация
Я не могу получить доступ к унаследованным частным переменным даже не с отражением
Частные свойства и методы относятся к классу, который был объявлен.
Они недоступны из производного класса, если вы не переопределяете их