我正在开发一个PHP项目,其中很多类在类树中都很高级,即它们有很多父类。
在某种程度上,考虑有一个类Food
,它有很多子类和子类等。我想在类getFoodClasses()
中实现一个方法Food
给我一个导致当前实例的所有子类的数组,即类Food
和当前实例之间的树中的类,包括后者。 Food
类本身及其所有超类不应包含在结果中。
示例:如果Food
的子类为Vegetable
,其子类为Fruit
,其子类为Banana
,则结果为{{ 1}},需要导致`array('Vegetable','Fruit','Banana')。
所以,
(Banana) $b->getFoodClasses()
结果是:
class Food extends SomeBaseClass
{
public function getFoodClasses()
{
/* Here goes the magic! */
}
}
class Vegetable extends Food {}
class Fruit extends Vegetable {}
class Banana extends Fruit {}
$b = new Banana;
print_r($b->getFoodClasses());
答案 0 :(得分:2)
我最终得到了这个功能。
/**
* Calculates the widget path between this class and the current instance.
* @return array An array with all subclasses in the path between this class and the current instance.
*/
public function getFoodClasses()
{
$reflClass = new ReflectionClass(get_class($this));
$classes = array();
while ($reflClass->getName() != __CLASS__)
{
$classes[] = $reflClass->getName();
$reflClass = $reflClass->getParentClass();
}
return $classes;
}
答案 1 :(得分:1)
不使用反射,你仍然可以使用一些简单的php函数来实现这一点。
class Food
{
public function getFoodClasses()
{
$class = get_class($this);
$classes = array($class);
while (($parentClass = get_parent_class($class)) && $parentClass != "Food")
{
array_unshift($classes, $parentClass); // Push onto the beginning because your example shows parents before children.
$class = $parentClass;
}
return $classes;
}
}
答案 2 :(得分:0)
仅供将来参考;这段代码实际上有效(从香蕉开始,去食品)。
<?php
class Food
{
public function getFoodClasses()
{
}
}
class Vegetable extends Food {}
class Fruit extends Vegetable {}
class Banana extends Fruit {}
$banana = new Banana;
$class = new ReflectionClass( get_class( $banana ) );
$parents = array( );
while( $parent = $class->getParentClass( ) ) {
$parents[] = $parent->getName( );
$class = $parent;
}
var_dump( $parents );