Does ReflectionClass :: getProperties () также получает свойства родителя?

Я пытаюсь получить доступ / изменить свойства класса «Родитель через отражение».

Если я запускаю ReflexClass :: getProperties () для дочернего элемента, он также возвращает любые свойства, которые имеет родитель?

Если это не так, есть ли способ доступа к родительским свойствам с помощью Reflection?

Я работал над этим быстрым тестом. Похоже, что частные свойства родителя скрыты, когда вы получаете свойства дочерних классов. Однако, если вы вызываете getParentClass() то getProperties() вас будет отсутствующий набор частных реквизитов.

 <?php class Ford { private $model; protected $foo; public $bar; } class Car extends Ford { private $year; } $class = new ReflectionClass('Car'); var_dump($class->getProperties()); // First chunk of output var_dump($class->getParentClass()->getProperties()); // Second chunk 

Выход (обратите внимание, что отсутствует частная версия Ford::model ):

 array(3) { [0]=> &object(ReflectionProperty)#2 (2) { ["name"]=> string(4) "year" ["class"]=> string(3) "Car" } [1]=> &object(ReflectionProperty)#3 (2) { ["name"]=> string(3) "foo" ["class"]=> string(4) "Ford" } [2]=> &object(ReflectionProperty)#4 (2) { ["name"]=> string(3) "bar" ["class"]=> string(4) "Ford" } } 

Второй кусок (содержит все свойства класса Ford):

 array(3) { [0]=> &object(ReflectionProperty)#3 (2) { ["name"]=> string(5) "model" ["class"]=> string(4) "Ford" } [1]=> &object(ReflectionProperty)#2 (2) { ["name"]=> string(3) "foo" ["class"]=> string(4) "Ford" } [2]=> &object(ReflectionProperty)#5 (2) { ["name"]=> string(3) "bar" ["class"]=> string(4) "Ford" } } 

Хотя краткий, принятый ответ пренебрегает возможностью дочернего класса со многими предками. Это метод экземпляра, который я использую для достижения этого:

 public function getProperties() { $properties = array(); try { $rc = new \ReflectionClass($this); do { $rp = array(); /* @var $p \ReflectionProperty */ foreach ($rc->getProperties() as $p) { $p->setAccessible(true); $rp[$p->getName()] = $p->getValue($this); } $properties = array_merge($rp, $properties); } while ($rc = $rc->getParentClass()); } catch (\ReflectionException $e) { } return $properties; } 

Он проходит иерархию до тех пор, пока не достигнет корневого класса, в то время как объединение свойств каждого родителя со свойствами его дочерних элементов (а в случае значений по умолчанию использует только значения по умолчанию, найденные в самой нижней части иерархии).

Я думаю, что вы не получите родительские частные свойства, потому что дочерний класс не может получить к ним доступ