如何在PHP中从对象本身外部获取父对象?

如何在PHP中从对象本身外部获取父对象?,php,reflection,parent,Php,Reflection,Parent,我使用反射来调整对象中的各种值,我需要调整一个对象的父对象 例如: class Ford extends Car { private $model; } class Car { private $color; } 我可以很容易地使用反射来更改模型,但是如何将父对象与子对象分开,以便在父对象上使用反射 一些我希望可能实现的psuedo代码: 问题要点: 在这种情况下,如何从对象外部完全更改$color 是否有类似Ford::parent或get\u parent\u objec

我使用反射来调整对象中的各种值,我需要调整一个对象的父对象

例如:

class Ford extends Car
{
    private $model;
}

class Car
{
    private $color;
}
我可以很容易地使用反射来更改模型,但是如何将父对象与子对象分开,以便在父对象上使用反射

一些我希望可能实现的psuedo代码:

问题要点:

在这种情况下,如何从对象外部完全更改$color

是否有类似Ford::parent或get\u parent\u object$Ford的产品可用

上面使用的对象不是确切的场景,只是用于说明概念。在现实世界中,我有一个父/子关系,我需要能够从外部访问/更改其中的值

答复


请检查我下面的答案…我找到了。

请参阅get\u parent\u class:

请参阅get\u parent\u class:

经过广泛审查,我发现我无法将对象的父对象作为对象本身之外的对象访问

然而,通过使用反射,我能够解决上面发布的示例:

    <?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'

在这里查看它的实际操作:

经过广泛的检查,我发现我无法作为对象本身之外的对象访问对象的父对象

然而,通过使用反射,我能够解决上面发布的示例:

    <?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'

请参见此处的操作:

这是函数I的静态版本,其中包含:


以下是函数I的静态版本,其中包含:



是的,我看到了…但这不就是父类的名称吗?在上面的例子中,我如何利用它来改变汽车的颜色?谢谢这是私人财产,所以你不应该直接进入。使用getter/setter方法,例如类Car{private$color:public function getColor{return$this->color;}public function setColor$newcolor{$this->color=$newcolor;}}通常可以工作,但是在这种特定情况下,我需要能够从外部更改值,而不以任何方式更改子类。这就是为什么到目前为止我一直在使用反射。所以你不能改变任何一个类?正确。它们完全独立于此功能而存在。真正的场景是我有一辆车,并动态创建了一个类,该类扩展了车的知识,以允许延迟加载车等。它基于Doctrine2处理代理的方式。是的,我看到了……但这不就是父类的名称吗?在上面的例子中,我如何利用它来改变汽车的颜色?谢谢这是私人财产,所以你不应该直接进入。使用getter/setter方法,例如类Car{private$color:public function getColor{return$this->color;}public function setColor$newcolor{$this->color=$newcolor;}}通常可以工作,但是在这种特定情况下,我需要能够从外部更改值,而不以任何方式更改子类。这就是为什么到目前为止我一直在使用反射。所以你不能改变任何一个类?正确。它们完全独立于此功能而存在。真正的场景是我有一辆车,并动态创建了一个类,该类扩展了车的知识,以允许延迟加载车等。它基于Doctrine2处理代理的方式。车应该具有$model属性。。它只是无法访问它,因为它是私有的。如果您在汽车上使用反射并尝试获取$model属性,它是否会给您一个错误?我没有尝试过。我会努力的,但我认为在这种情况下这几乎是无关紧要的。上面使用的对象不是确切的场景,只是用于说明概念。在现实世界中,我有一个父/子关系,我需要能够从外部访问/更改每个属性中的值。PHP中的属性没有这种关系。您可以使用parent::myMethod访问父方法,但是对于属性,您看不到这一点,因为它们都存在于同一个平面上。。只有它们的范围和可访问性发生了变化。我对这个问题的解释可能是完全错误的。。如果您在汽车/福特的示例中包含您试图应用的psuedo反射代码,这可能会有所帮助。当然,这就是我使用反射的原因……您可以设置$entity的值。若我能做到这一点,那个么我就理所当然地可以设置$entity::parent的值。。。没有?@MikeB刚刚添加了一些psuedo代码:汽车应该有$model属性。。它只是无法访问它,因为它是私有的。如果您在汽车上使用反射并尝试获取$model属性,它是否会给您一个错误?我没有尝试过。我会努力的,但我认为在这种情况下这几乎是无关紧要的。上面使用的对象不是确切的场景,只是用于说明概念。在现实世界中,我有一个父/子关系,我需要能够从外部访问/更改每个属性中的值。PHP中的属性没有这种关系。您可以访问
使用parent::myMethod的父方法,但您看不到属性的父方法,因为它们都存在于同一平面上。。只有它们的范围和可访问性发生了变化。我对这个问题的解释可能是完全错误的。。如果您在汽车/福特的示例中包含您试图应用的psuedo反射代码,这可能会有所帮助。当然,这就是我使用反射的原因……您可以设置$entity的值。若我能做到这一点,那个么我就理所当然地可以设置$entity::parent的值。。。没有?@MikeB刚刚添加了一些psuedo代码:欢迎使用堆栈溢出!虽然这个代码片段可能会解决这个问题,包括一个解释,以提高您的文章的质量。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。欢迎使用堆栈溢出!虽然这个代码片段可能会解决这个问题,包括一个解释,以提高您的文章的质量。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。谢谢!你救了我一天!非常感谢。你救了我一天!
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;
}
function getPrivateProperty(\ReflectionClass $class, $property)
{
    if ($class->hasProperty($property)) {
        return $class->getProperty($property);
    }

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

    return null;
}