Php 如何在一个类和它的一个子类的实例之间找到子类的路径?
我正在从事一个PHP项目,其中有很多类在类树中处于较高级别,即它们有很多父类Php 如何在一个类和它的一个子类的实例之间找到子类的路径?,php,inheritance,Php,Inheritance,我正在从事一个PHP项目,其中有很多类在类树中处于较高级别,即它们有很多父类 在某种程度上,考虑有一个类食物< /代码>,它有相当多的子类和子类等。我想在类食物< /代码>中实现一个方法 GeFoeCaseCube()/代码>,它给了我一个导致当前实例的所有子类的数组,即,在类食物和当前实例(包括后者)之间的树中的类。Food类本身及其所有超类不应包含在结果中 示例:如果食品的子类是蔬菜,它有一个子类水果,然后它有一个子类香蕉,那么on(Banana)$b->getFoodClass(),需要生
在某种程度上,考虑有一个类<代码>食物< /代码>,它有相当多的子类和子类等。我想在类<代码>食物< /代码>中实现一个方法<代码> 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,但是看看您的代码,它似乎完全做到了它应该做的事情。理想情况下,应该在两种实现上都做一个基准测试,看看哪一种在性能方面是有利的。