获取PHP中所有扩展类

8

假设我有一个类:

<?
class ObjectModel {
}

我还有其他类,例如:

<?
class SomeNewClass extends ObjectModel {
}

class SomeOtherNewClass extends ObjectModel {
}

有没有一种方法可以根据ObjectModel类获取其子类(SomeNewClass 和 SomeOtherNewClass)?

不,你不能直接这样做。为什么你需要这个?一个合理的方式是在一个单独的配置文件中追踪它,但是那有点繁琐。继承的目的是隐藏细节,请求继承链直接冲突了这个目标。你不应该知道。 - Halcyon
您可以通过parent::__construct()注册新的子类,但这可能会有些笨重。您能否澄清您的意图? - George Cummins
我正在构建一个PHP-CMS。其中每个模型都继承自ObjectModel。现在,如果控制器应该查找特定的模型,该模型可能位于动态路径下,那么查找该类并使用它将是很好的选择。例如:SomeNewClass模型可以位于/_components/sample/_models/somenewclass.php或/_brain/_components/navigation/_models/somenewclass.php下。 - Andre Zimpel
1
你可以使用 'get_declared_classes()' 获取所有已声明的类列表,然后使用 'instance_of' 遍历该列表。 - Jordonias
3个回答

15
class ObjectModel {
}

class SomeNewClass extends ObjectModel {
}

class SomeOtherNewClass extends ObjectModel {
}

class SomeOtherNewClassLol extends ObjectModel {
}

function get_extends_number($base){
    $rt=0;
  foreach(get_declared_classes() as $class)
        if(is_subclass_of($class,$base)) $rt++;
        return $rt;
}

echo get_extends_number('ObjectModel'); //output: 3

是的,你可以做到,DEMO


1
如果SomeOtherNewClassLol扩展了SomeOtherNewClass,你将得到相同的结果。 - Alix Axel
@AlixAxel 如果 SomeOtherNewClassLol 继承了 SomeOtherNewClass,你也继承了 ObjectModel,那么他的方法/属性不是私有的就可以被使用。 - Sam
在这种情况下,“SomeOtherNewClassLol”仍然继承“ObjectModel”。它仍将可以访问在“ObjectModel”中创建的方法/属性,因为它仍然是一个后代,即使是孙子。 - Jonathan Kuhn
1
只是说他要求类的子类(而不是孙子类),此外他的示例代码并没有表明他想要超过1个继承级别。 - Alix Axel
没错,只需要一级就可以了。但是也能获取孙子节点的能力也很酷! - Andre Zimpel

4
您可以迭代由get_declared_classes()返回的所有类,并检查它们的反射(Reflection :: isSubclassOf ),但是-在使用自动加载时,这种方法行不通。

2

不确定这是否会被下降,但您可以通过以下方式进行黑客攻击:

  1. get_declared_classes
  2. 对于1中的每个类,使用get_parent_class

虽然不很好看,但如果已加载子类,则可能会成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接