4

我需要获取扩展了另一个父类的所有声明的类。

所以例如...

class ParentClass {

}

class ChildOne extends ParentClass {

}

class ChildTwo extends ParentClass {

}

class ChildThree {

}

我需要一个输出这个的数组:

array('ChildOne', 'ChildTwo')

我是 PHP OOP 的新手,但基于一些谷歌搜索,我想出了这个解决方案。

$classes = array();

foreach( get_declared_classes() as $class ) {
    if ( is_subclass_of($class, 'ParentClass') ){
        array_push($classes, $class);
    }
}

我想问的是,这是否是做我想做的事情的最佳实践,还是有更好的方法?全局范围将包含许多不是ParentClass. 循环遍历所有声明的类是最好的方法吗?

编辑 (澄清目的)

我想要实现的是实例化每个扩展父类的子类。

我想$childone = new ChildOne; $childtwo = new ChildTwo;为每个孩子做ParentClass

4

2 回答 2

2

you can try to log the declaration of a class the first time it is loaded. it suppose you are using autoloading.

if you do not use composer but a custom loader :

It's the easiest way :

$instanciatedChildren = array();//can be a static attribute of the A class 
spl_autoload_register(function($class)use($instanciatedChildren){
   //here the code you use 
   if(is_subclass_of($class,'A')){
       $instanciatedChildren[] = $class;
   }
 }

if you use composer :

you can, make a class that extends composer/src/Composer/Autoload/ClassLoader.php and then override the loadClass method to add the condition given above. and then register your new loader and unregister the old one.

于 2012-11-27T16:31:57.453 回答
1

您的解决方案似乎很好,但我不确定您为什么要这样做。php 中没有简单的方法可以说,“给我全局某个父类的所有声明的类”,而不实际检查全局每个声明的类。即使您加载了几百个要循环的类,它也不应该太重,因为它们都在内存中。

如果您只想跟踪特定父类的已加载子类,为什么不创建一个注册表来在它们加载时跟踪它们呢?您可以在用于子类或事件的自动加载器或工厂中进行此跟踪,只需在类定义之前的类文件顶部放置一些内容即可。

于 2012-11-27T15:53:45.593 回答