在php中获取父类的所有已定义类

时间:2011-07-12 21:28:37

标签: php oop class

在包含所有文件后,我需要确定哪些类扩展了父类,所以:

class foo{
}
class boo extends foo{
}
class bar extends foo{
}

我希望能够获得如下数组:

array('boo','bar');

4 个答案:

答案 0 :(得分:20)

如果你需要它,它真的闻起来像坏代码,基类不应该知道这一点。

但是,如果已包含定义(即您不需要包含可能包含类的新文件),则可以运行:

$children  = array();
foreach(get_declared_classes() as $class){
    if($class instanceof foo) $children[] = $class;
}

答案 1 :(得分:18)

采用Wrikken的回答并使用Scott BonAmi的建议进行纠正,然后得到:

$children = array();
foreach( get_declared_classes() as $class ){
  if( is_subclass_of( $class, 'foo' ) )
    $children[] = $class;
}

is_a()instanceof的其他建议对此不起作用,因为它们都期望一个对象的实例,而不是一个类名。

答案 2 :(得分:5)

使用

$ allClasses = get_declared_classes();

获取所有课程的列表。

然后,使用PHP's Reflection feature构建继承树。

答案 3 :(得分:4)

我很确定以下解决方案或类似的东西将非常适合您的问题。恕我直言,你可以做以下(这是一种观察者模式):

1-定义一个接口,称之为Fooable

interface Fooable{
    public function doSomething();
}

2-所有目标类必须实现该接口:

class Fooer implements Fooable{
    public function doSomething(){
         return "doing something";
    }
}

class SpecialFooer implements Fooable{
    public function doSomething(){
         return "doing something special";
    }
}

3-建立注册商课程,将其称为FooRegisterar

class FooRegisterar{
    public static $listOfFooers =array();

    public static function register($name, Fooable $fooer){
         self::$listOfFooers[$name]=$fooer;
    }
    public static function getRegisterdFooers(){
         return self::$listOfFooers;
    }
}

4-引导脚本中的某个位置或引导脚本中包含的某些脚本:

FooRegisterar::register("Fooer",new Fooer());
FooRegisterar::register("Special Fooer",new SpecialFooer());

5-在主要代码中:

class FooClient{

    public function fooSomething(){
         $fooers = FooRegisterar::getRegisterdFooers();
         foreach($fooers as $fooer){
              $fooer->doSomthing();
         }
    }
}