在包含所有文件后,我需要确定哪些类扩展了父类,所以:
class foo{
}
class boo extends foo{
}
class bar extends foo{
}
我希望能够获得如下数组:
array('boo','bar');
答案 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)
答案 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();
}
}
}