2011-04-12 87 views
3

我有一个对象,并希望列出所有父类,直到stdClass或其他。在继承树中获取PHP对象的祖先

我添加了一个多态场到我的数据库表(比如类),并希望自动查找器方法,这样的超类也回来了,这样我可以在一个点上跳入继承树我知道不一定最终的子类:

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

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

感谢您的任何投入,我觉得我缺少明显的东西在这里。

+1

的可能重复的[PHP:在运行时的对象的确定的类层次结构](http://stackoverflow.com/questions/4209201/php-determining-class-hierarchy-of-an-object-at-runtime) – Gordon 2011-04-12 20:01:05

回答

6

被指向到重复的问题,我已经走了以后:

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功能是我一直在俯瞰明显的事情。

我认为Reflection对于这个简单的任务来说是过分的。

2

正如你可以在阅读manual你也可以给一个类名作为字符串的函数。

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

这里索引0是对象本身的类名:

10

使用反射

$class = new ReflectionClass($object); 

$lineage = array(); 

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

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

ReflectionClass接受类或对象的任一名称。