我有一个对象,想要列出所有父类,直到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;
}
但是这会实例化一个对象,有没有人知道如何实现这个目标?
感谢您的任何意见,我觉得我在这里遗漏了一些明显的东西。
答案 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
是对象本身的类名: