Php 如何在一个类和它的一个子类的实例之间找到子类的路径?

Php 如何在一个类和它的一个子类的实例之间找到子类的路径?,php,inheritance,Php,Inheritance,我正在从事一个PHP项目,其中有很多类在类树中处于较高级别,即它们有很多父类 在某种程度上,考虑有一个类食物< /代码>,它有相当多的子类和子类等。我想在类食物< /代码>中实现一个方法 GeFoeCaseCube()/代码>,它给了我一个导致当前实例的所有子类的数组,即,在类食物和当前实例(包括后者)之间的树中的类。Food类本身及其所有超类不应包含在结果中 示例:如果食品的子类是蔬菜,它有一个子类水果,然后它有一个子类香蕉,那么on(Banana)$b->getFoodClass(),需要生

我正在从事一个PHP项目,其中有很多类在类树中处于较高级别,即它们有很多父类

在某种程度上,考虑有一个类<代码>食物< /代码>,它有相当多的子类和子类等。我想在类<代码>食物< /代码>中实现一个方法<代码> GeFoeCaseCube()/代码>,它给了我一个导致当前实例的所有子类的数组,即,在类

食物
和当前实例(包括后者)之间的树中的类。
Food
类本身及其所有超类不应包含在结果中

示例:如果
食品
的子类是
蔬菜
,它有一个子类
水果
,然后它有一个子类
香蕉
,那么on
(Banana)$b->getFoodClass()
,需要生成“数组('蔬菜','水果','香蕉')”

所以

其结果是:

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

不使用反射,您仍然可以使用一些简单的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;
  }
}

不使用反射,您仍然可以使用一些简单的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;
  }
}

我最终得到了这个函数

/**
 * 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;
}

我最终得到了这个函数

/**
 * 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;
}

仅供将来参考;这个代码实际上是有效的(从香蕉开始,到食物)


仅供将来参考;这个代码实际上是有效的(从香蕉开始,到食物)


嗯,这也不会在当前类中停止。:)(我应该在我的示例中更准确地提到这一点,请参见我的更新,其中食品也有父类。)并且,在您的示例中,还包括
食品
条目。这不应该发生,有点不清楚。我上面的评论的意思是,我不希望食物的超类出现在结果中。好吧,这也不会在当前类中停止。:)(我应该在我的示例中更准确地提到这一点,请参见我的更新,其中食品也有父类。)并且,在您的示例中,还包括
食品
条目。这不应该发生,有点不清楚。我上面的评论的意思是,我不想在结果中出现Food的超类。很高兴看到PHP内置程序也可以实现这一点。我现在不使用这个解决方案,因为我喜欢使用SPL,但是看看您的代码,它似乎完全做到了它应该做的事情。理想情况下,我们应该在两种实现上都做一个基准测试,看看哪一种在性能方面是有利的。很高兴看到PHP内置也可以实现这一点。我现在不使用这个解决方案,因为我喜欢使用SPL,但是看看您的代码,它似乎完全做到了它应该做的事情。理想情况下,应该在两种实现上都做一个基准测试,看看哪一种在性能方面是有利的。