如何在php的(超级)父类中获取第一个被称为子类的名称

时间:2019-08-03 08:34:01

标签: php

假设我们有三个这样的类:

class A {
    public function name(){
        echo get_called_class();
    }
}


class B extends A {
    public function name(){
        parent::name();
    }
}

class C extends B {
    public function name(){
        parent::name();
    }
}

$c = new C();
$c->name(); //Result is C

如果运行此代码,结果将为“ C”。 但是,我需要第一个子类的名称“ B”。 有什么主意吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

这很有趣,感谢您提出的有趣问题!

以下代码将使您能够从任何子类中获取根父级的第一个孩子。

class A {
    public function name(){
        return 'Undefined';
    }

    protected function identify_first_child() {
        $root = self::class;
        $node = static::class;
        $parent = get_parent_class($node);

        while ($parent !== $root) {
            $node = $parent;
            $parent = get_parent_class($parent);
        }

        return $node;
    }
}

class B extends A {
    public function name(){
        return $this->identify_first_child();
    }
}

class C extends B {
    public function name(){
        return $this->identify_first_child();
    }
}

class D extends A {
    public function name(){
        return $this->identify_first_child();
    }
}

class E extends D {
    public function name(){
        return $this->identify_first_child();
    }
}

class F extends A {
    public function name(){
        return $this->identify_first_child();
    }
}

$a = new A();
echo $a->name() . '<br>';

$b = new B();
echo $b->name() . '<br>';

$c = new C();
echo $c->name() . '<br>';

$d = new D();
echo $d->name() . '<br>';

$e = new E();
echo $e->name() . '<br>';

$f = new F();
echo $f->name() . '<br>';

这将输出以下内容:

Undefined
B
B
D
D
F