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

Tre*_*rey 23 php oop class

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

class foo{
}
class boo extends foo{
}
class bar extends foo{
}
Run Code Online (Sandbox Code Playgroud)

我希望能够像以下一样获取数组:

array('boo','bar');
Run Code Online (Sandbox Code Playgroud)

Wri*_*ken 22

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

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

$children  = array();
foreach(get_declared_classes() as $class){
    if($class instanceof foo) $children[] = $class;
}
Run Code Online (Sandbox Code Playgroud)

  • 它有点旧,但你可以使用`is_subclass_of` [(link)](http://www.php.net/manual/en/function.is-subclass-of.php)代替`is_a`和`instanceof `. (4认同)
  • 谢谢@ScottBonAmi; 你的答案有效,但`is_a()`和`instanceof`对我来说并不适合,因为它们都期望一个对象,而不是一个类名. (4认同)
  • 这基本上就是我所拥有的,除了我使用`is_a`而不是`instanceof` ...我明白为什么你会这么想,但基类实际上不需要知道任何东西,这更像是一个插件管理器功能:) (3认同)
  • 我想补充一点,这不像“糟糕的代码”——它更符合动态类反射,这就是反射函数存在的原因以及动态类创建/加载有很多好处的原因。 (3认同)

Mik*_*kel 20

采用Wrikken的答案并使用Scott BonAmi的建议进行纠正,你会得到:

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

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


Ste*_*eAp 5

使用

$ allClasses = get_declared_classes();

获取所有类的列表。

然后,使用PHP的Reflection功能构建继承树。