PHP OOP:获取已扩展另一个父类的所有声明的类

时间:2012-11-27 15:50:04

标签: php

我需要获取所有声明的类,这些类已经扩展了另一个父类。

所以例如......

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

2 个答案:

答案 0 :(得分:2)

您可以尝试在第一次加载时记录类的声明。 它假设您正在使用自动加载。

如果你不使用composer而是使用自定义加载器:

这是最简单的方法:

$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;
   }
 }

如果您使用composer:

你可以做一个扩展composer/src/Composer/Autoload/ClassLoader.php的课程 然后重写loadClass方法以添加上面给出的条件。然后注册新的加载器并取消注册旧的加载器。

答案 1 :(得分:1)

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

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