如何在类及其子类之一的实例之间找到子类的路径?

时间:2012-05-09 11:39:14

标签: php inheritance

我正在开发一个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());

3 个答案:

答案 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 );