2012-05-09 1 views
0

많은 클래스가 클래스 트리에서 상위 수준으로 정렬되어있는 PHP 프로젝트, 즉 상위 클래스가 많이 있습니다. 내가 나에게로 이어질 모든 서브 클래스의 배열을 제공합니다 클래스 Food의 방법 getFoodClasses()을 구현하려는 서브 클래스 및 하위 서브 클래스 등의 꽤 많이 가지고있는 클래스 Food이,이 고려 어떤 수준에서 클래스와 서브 클래 싱 중 하나의 인스턴스 사이에 서브 클래스의 경로를 찾는 방법은 무엇입니까?

, 현재 인스턴스, 즉 클래스 Food 사이의 트리에있는 클래스와 현재 인스턴스 (후자 포함). Food 클래스 자체와 모든 상위 클래스가 결과에 포함되지 않아야합니다.

예 : Food의 서브 클래스 다음 서브 Banana을 갖는 서브 Fruit을 가지고 Vegetable을 것이 있다면, (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()); 

: 반사를 사용하지 않고

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

답변

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

, 당신은 여전히를 달성하기 위해 몇 가지 간단한 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; 
    } 
} 
+0

PHP 내장 함수가 이것을 달성 할 수 있다는 것을 알기가 매우 좋습니다. 지금 SPL을 사용하는 것처럼 솔루션을 사용하지는 않겠지 만 코드를 보면 꼭해야 할 일을하는 것처럼 보입니다. 하나는 성능에 관해서 어떤 것이 유리한 지 알아보기 위해 두 구현 모두에서 벤치 마크를 수행하는 것이 이상적입니다. –

0

나중에 참조 할 수 있도록; 이 코드는 실제로 작동합니다 (바나나에서 시작하여 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); 
+0

글쎄, 그것은 현재 클래스에서 멈추지 않는다. :) (필자는 예를 들어 더 자세히 언급 했어야하는데, Food에도 부모 클래스가있는 내 업데이트를 참조하십시오.) 그리고 예제에서 'Food'항목도 포함되어 있습니다. 그렇게해서는 안됩니다. –

+0

조금 분명하지 않습니다. 위의 내 의견에 의미하는 바는 Food의 수퍼 클래스가 결과에 나타나기를 원하지 않는다는 것입니다. –