0

私は、多くのクラスがクラスツリーで高レベルになっているPHPプロジェクトに取り組んでいます。つまり、それらには多くの親クラスがあります。

あるレベルで、非常に多くのサブクラスやサブサブクラスなどを含むクラスがあると考えてください。現在のインスタンスにつながるすべてのサブクラスの配列を提供するクラスFoodのメソッドを実装したいと思います。クラスと現在のインスタンスの間のツリー(後者を含む)。クラス自体とそのすべてのスーパークラスを結果に含めることはできません。getFoodClasses()FoodFoodFood

例:のサブクラスが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

今後の参考のために。このコードは実際に機能します (Banana から Food まで)。

<?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 に答える