Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中获取所有扩展类_Php_Class_Children - Fatal编程技术网

在PHP中获取所有扩展类

在PHP中获取所有扩展类,php,class,children,Php,Class,Children,假设我有一门课,比如: <? class ObjectModel { } 您可以迭代get_declared_classes()返回的所有类,并检查它们的反射(Reflection::isSubclassOf) 但是-当您使用自动加载时,这将不起作用。不确定这是否会被否决,但您可以通过以下方式: 获取已声明的类 为1上的每个类获取父类 这并不漂亮,但如果子类被加载,这是可能的 class ObjectModel { } class SomeNewClass extends Object

假设我有一门课,比如:

<?
class ObjectModel {
}

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


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

不确定这是否会被否决,但您可以通过以下方式:

  • 获取已声明的类
  • 为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
    

    是的,你能做到,

    不,你不能直接做到。你为什么需要这个?一个合理的方法是在一个单独的配置文件中跟踪这一点,但这有点乏味。继承的要点是隐藏细节,请求继承链与该目标直接冲突。您不必知道。您可以通过
    parent::\u construct()
    注册新的子项,但这可能很麻烦。你能澄清你的意图吗?我正在构建一个PHP-CMS。其中的每个模型都继承自ObjectModel。现在,如果一个控制器应该寻找一个特定的模型,它可能位于一个动态路径上,那么最好寻找并使用这个类。e、 g:SomeNewClass模型可以位于/_components/sample/_models/SomeNewClass.php下,也可以位于/_brain/_components/navigation/_models/SomeNewClass.php下。您可以获得所有声明类的列表“get_声明的_类()'并用'instance_of'遍历该列表,如果
    SomeOtherNewClassLol
    extends
    SomeOtherNewClass
    ,您将得到相同的结果。@AlixAxel如果SomeOtherNewClassLol扩展了SomeOtherNewClass,您也扩展了ObjectModel,那么他的方法/属性就可以是非私有的used@AlixAxel那么,,
    SomeOtherNewClassLol
    仍在继承
    ObjectModel
    。它仍然可以访问在
    ObjectModel
    中创建的方法/属性,因为它仍然是后代,即使是孙子。只是说他要求类的子级(而不是孙子级),他的示例代码也不表示他想要超过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