Я пытаюсь получить доступ / изменить свойства класса «Родитель через отражение».
Если я запускаю 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; }
Он проходит иерархию до тех пор, пока не достигнет корневого класса, в то время как объединение свойств каждого родителя со свойствами его дочерних элементов (а в случае значений по умолчанию использует только значения по умолчанию, найденные в самой нижней части иерархии).
Я думаю, что вы не получите родительские частные свойства, потому что дочерний класс не может получить к ним доступ