在继承树中获取PHP对象的祖先

Que*_*ark 4 php oop inheritance traversal parent

我有一个对象,想要列出所有父类,直到stdClass或其他什么.

我已经在我的数据库表中添加了一个多态字段(比如类别),并希望自动化我的finder方法,以便还返回超类,这样我就可以跳到继承树中,我知道不一定是最后的子类:

FoodCategory::find_by_id(10) === Category::find_by_id(10)

SELECT * FROM categories WHERE ..... AND type IN ('FoodCategory', 'Category');
Run Code Online (Sandbox Code Playgroud)

粗略地我猜:

function get_class_lineage($object){
    $class = get_parent_class($object);
    $lineage = array();
    while($class != 'stdClass'){
        $dummy_object = new $class();
        $lineage[] = $class = get_parent_class($dummy_object);
    }

    return $lineage;
}
Run Code Online (Sandbox Code Playgroud)

但这会实例化一个对象,有没有人知道如何实现这个目标?

感谢任何输入,我觉得我在这里遗漏了一些明显的东西.

Chr*_*ing 10

使用反射

$class = new ReflectionClass($object);

$lineage = array();

while ($class = $class->getParentClass()) {
    $lineage[] = $class->getName();
}

echo "Lineage: " . implode(", ", $lineage);
Run Code Online (Sandbox Code Playgroud)

ReflectionClass接受类的名称或对象.


Que*_*ark 8

在指出我已经去过的重复问题之后:

function get_class_lineage($object){
    $class_name = get_class($object);
    $parents = array_values(class_parents($class_name));
    return array_merge(array($class_name), $parents);
}
Run Code Online (Sandbox Code Playgroud)

标准库中的class_parents函数是我忽略的显而易见的事情.

我认为反思对于这个简单的任务来说太过分了.