【问题标题】:Get all extended Classes in PHP获取 PHP 中的所有扩展类
【发布时间】:2013-05-21 21:46:48
【问题描述】:

假设我有这样的课程:

<?
class ObjectModel {
}

我还有一些其他课程,例如:

<?
class SomeNewClass extends ObjectModel {
}

class SomeOtherNewClass extends ObjectModel {
}

有没有办法根据 ObjectModel 类来获取孩子(SomeNewClass & SomeOtherNewClass)?

【问题讨论】:

  • 不,您不能直接执行此操作。你为什么需要这个?一种合理的方法是在单独的配置文件中跟踪这一点,但这有点乏味。继承的重点是隐藏细节,请求继承链与那个目标直接冲突。你不应该知道。
  • 您可以通过parent::__construct() 注册新孩子,但这可能很笨拙。你能澄清一下你的意图吗?
  • 我正在构建一个 PHP-CMS。并且其中的每个模型都继承自 ObjectModel。现在,如果控制器应该寻找一个特定的模型,它可能在一个动态路径上,那么寻找那个类并使用它会很好。例如:SomeNewClass 模型可以在 /_components/sample/_models/somenewclass.php 下,也可以在 /_brain/_components/navigation/_models/somenewclass.php 下
  • 你可以得到一个所有声明类的列表'get_declared_classes()'并用'instance_of'遍历该列表

标签: php class children


【解决方案1】:
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

【讨论】:

  • 如果 SomeOtherNewClassLol 扩展 SomeOtherNewClass 你会得到相同的结果。
  • @AlixAxel 如果 SomeOtherNewClassLol 扩展 SomeOtherNewClass,你也扩展 ObjectModel,那么他的方法/属性不是私有的可以使用
  • @AlixAxel 在这种情况下,SomeOtherNewClassLol 仍然继承 ObjectModel。它仍然可以访问在ObjectModel 中创建的方法/属性,因为它仍然是后代,即使是孙子。
  • 只是说他要求类孩子(不是孙子),而且他的示例代码并不表明他想要超过 1 级继承。
  • 是的,一级就足够了。但是能够得到孙子也很酷!
【解决方案2】:

不确定这是否会被否决,但您可以自行解决:

  1. get_declared_classes
  2. get_parent_class 1 上的每个班级

虽然不漂亮,但是如果加载了子类,就可以了。

【讨论】:

    【解决方案3】:

    您可以迭代 get_declared_classes() 返回的所有类并检查它们的反射 (Reflection::isSubclassOf)

    但是 - 当您使用自动加载时,这将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 2016-11-09
      • 1970-01-01
      • 2021-01-09
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多