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

时间:2011-04-12 19:08:13

标签: php oop inheritance parent traversal

我有一个对象,想要列出所有父类,直到stdClass或其他任何内容。

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

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

SELECT * FROM categories WHERE ..... AND type IN ('FoodCategory', 'Category');

粗略地说:

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;
}

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

感谢您的任何意见,我觉得我在这里遗漏了一些明显的东西。

3 个答案:

答案 0 :(得分:10)

使用反思

$class = new ReflectionClass($object);

$lineage = array();

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

echo "Lineage: " . implode(", ", $lineage);

ReflectionClass接受类的名称或对象。

答案 1 :(得分: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);
}

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

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

答案 2 :(得分:2)

正如您可以在manual阅读的那样,您也可以将一个类名作为字符串提供给该函数。

$class = get_class($this);
$lineage = array();
do {
  $lineage[] = $class;
  $class = get_parent_class($class);
} while ($class != 'stdClass');

此处索引0是对象本身的类名: