Как получить родительский объект в PHP, из-за пределов самого объекта? - PullRequest
1 голос
/ 28 марта 2012

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

Например:

class Ford extends Car
{
    private $model;
}

class Car
{
    private $color;
}

Я могу легко использовать Reflection для изменения модели, но как я могу отделить родителя от дочернего, чтобы я мог использовать Reflection на родителя?

Некоторые псевдо-коды для того, что я надеюсь, возможно:

$ford = new Ford();

$manipulator = new Manipulator($ford);

$manipulator->set('model','F-150');
$manipulator->setParentValue('color','red');

class Manipulator
{
    public function __construct($class) {
        $this->class = $class;
        $this->reflection = new \ReflectionClass($class);
    }

    public function set($property,$value) {
        $property = $this->reflection->getProperty($property);
        $property->setAccessible(true);
        $property->setValue($this->class,$value);
    }

    public function setParentValue() {

        $parent = $this->reflection->getParent();

        $property = $this->reflection->getProperty($property);
        $property->setAccessible(true);

        // HOW DO I DO THIS?

        $property->setValue($this->class::parent,$value);
    }
}

Суть вопроса:

В этом случае, как я могу полностью изменить цвет $ за пределами объекта?

Есть ли что-то вроде Ford :: parent () или get_parent_object ($ ford)?

Примечание

Объекты, использованные выше, не являются точным сценарием, а просто используются для иллюстрации концепции. В случае с реальным миром у меня есть отношения родитель / ребенок, и мне нужно иметь возможность получать / изменять значения в каждом из них извне.

ОТВЕТ

Пожалуйста, проверьте мой ответ ниже ... Я понял это.

Ответы [ 4 ]

4 голосов
/ 29 марта 2012

После тщательного анализа я обнаружил, что не могу получить доступ к родительскому объекту КАК ОБЪЕКТУ вне самого объекта.

Однако, используя Reflections, я смог решить приведенный выше пример:

    <?php
class Car
{
    private $color;

    public function __construct()
    {
        $this->color = 'red';
    }

    public function color()
    {
        return $this->color;
    }
}

class Ford extends Car
{
}

$ford = new Ford();

echo $ford->color(); // OUTPUTS 'red'

$reflection = new ReflectionClass($ford);

$properties = $reflection->getProperties();
foreach($properties as $property) {
    echo $property->getName()."\n>";
}

$parent = $reflection->getParentClass();

$color = $parent->getProperty('color');
$color->setAccessible(true);
$color->setValue($ford,'blue');

echo $ford->color(); // OUTPUTS 'blue'

Смотрите это в действии здесь: http://codepad.viper -7.com / R45LN0

1 голос
/ 01 ноября 2016
function getPrivateProperty(\ReflectionClass $class, $property)
{
    if ($class->hasProperty($property)) {
        return $class->getProperty($property);
    }

    if ($parent = $class->getParentClass()) {
        return getPrivateProperty($parent, $property);
    }

    return null;
}
1 голос
/ 28 марта 2012
0 голосов
/ 17 июня 2015

Вот статическая версия функции. Я ответил на другой ваш вопрос с:

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