0

我正在开发一个 PHP 项目,其中很多类在类树中是高级别的,即它们有很多父类。

在某种程度上,考虑有一个类Food,它有很多子类和子子类等。我想getFoodClasses()在类Food中实现一个方法,它给我一个导致当前实例的所有子类的数组,即类Food和当前实例之间的树,包括后者。类Food本身及其所有超类不应包含在结果中。

示例:如果一个子类FoodVegetable,它有一个子类Fruit,然后有一个子类Banana,那么 on 的结果(Banana) $b->getFoodClasses()需要产生 `array('Vegetable', 'Fruit', 'Banana')。

所以,

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());

结果是:

Array
(
    [0] => Vegetable
    [1] => Fruit
    [2] => Banana
)
4

3 回答 3

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;
}
于 2012-05-09T12:37:27.223 回答
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;
  }
}
于 2012-05-09T12:11:01.287 回答
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 );
于 2012-05-09T12:49:25.283 回答