[已解决]父类中如何获取发起调用的子类的所有属性及值?

父类:

class Parent {
    public function build()
    {
        // 获取当前发起调用的子类的属性和值进行其他操作
    }
}

子类1:

class Child1 extends Parent
{
    private $aa = 1;
    private $bb = 2;
}

子类2:

class Child2 extends Parent
{
    private $cc = 3;
    private $dd = 4;
}

调用:

$child1 = new Child1();
$child1->build(); // 获取到的值为array('aa'=>1,'bb'=>2)
$child2 = new Child2();
$child2->build();// 获取到的值为array('cc'=>3,'dd'=>4)

我想要实现这种功能,build方法里该怎么写呢?

JaguarJack
最佳答案
class Parented {
    public function build()
    {
        // 获取当前发起调用的子类的属性和值进行其他操作
        $p = (new ReflectionClass($this))->getProperties();

        // var_dump($p);

        $arr = [];

        foreach ($p as $v) {
            $v->setAccessible(true);
            $arr[$v->getName()] = $v->getValue($this);
        }

        var_dump($arr);
    }
}

class Child1 extends Parented
{
    private $aa = 1;
    private $bb = 2;
}


class Child2 extends Parented
{
    private $cc = 3;
    private $dd = 4;
}

$child1 = new Child1();
$child1->build(); // 获取到的值为array('aa'=>1,'bb'=>2)
$child2 = new Child2();
$child2->build();//
3年前 评论
讨论数量: 6
<?php

interface GetChilder
{
    public function child_value();
}

abstract class Parent1  implements GetChilder
{
    public function build()
    {
        // 获取当前发起调用的子类的属性和值进行其他操作
        var_dump($this->child_value());
    }

}

class Child1 extends Parent1 implements GetChilder
{
    private $aa = 1;
    private $bb = 2;

    public function child_value()
    {
        return [
            'aa' => $this->aa,
            'bb' => $this->bb,
        ];
    }
}

class Child2 extends Parent1 implements GetChilder
{
    private $cc = 3;
    private $dd = 4;

    public function child_value()
    {
        return [
            'cc' => $this->cc,
            'dd' => $this->dd,
        ];
    }
}

$child1 = new Child1();
$child1->build(); // 获取到的值为array('aa'=>1,'bb'=>2)
$child2 = new Child2();
$child2->build();// 获取到的值为array('cc'=>3,'dd'=>4)

能打印正确结果。

3年前 评论
JaguarJack
class Parented {
    public function build()
    {
        // 获取当前发起调用的子类的属性和值进行其他操作
        $p = (new ReflectionClass($this))->getProperties();

        // var_dump($p);

        $arr = [];

        foreach ($p as $v) {
            $v->setAccessible(true);
            $arr[$v->getName()] = $v->getValue($this);
        }

        var_dump($arr);
    }
}

class Child1 extends Parented
{
    private $aa = 1;
    private $bb = 2;
}


class Child2 extends Parented
{
    private $cc = 3;
    private $dd = 4;
}

$child1 = new Child1();
$child1->build(); // 获取到的值为array('aa'=>1,'bb'=>2)
$child2 = new Child2();
$child2->build();//
3年前 评论

@JaguarJack 我尝试过反射类,但是就是获取value这一步难到了,我直接用的 $value->getValue(),这样不行我就放弃了,没想到要给参数$this才能获取到。。感谢

3年前 评论
秦晓武

这样设计不符合常理吧,子类对于父类来说是未知的。 建议这样设计:

class Parent1 {
    protected $aa;
    protected $bb;
    public function build()
    {
        // 获取当前发起调用的子类的属性和值进行其他操作
        var_dump($this->aa);
    }
}
class Child1 extends Parent1
{
    protected $aa = 1;
    protected $bb = 2;
}
class Child2 extends Parent1
{
    protected $aa = 3;
    protected $bb = 4;
}
3年前 评论

@秦晓武 问题是每个子类的属性不一样 :pensive:,所以要在父类动态获取

3年前 评论
秦晓武 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!