PHP可以执行Magic Instantiation吗?

Aid*_*ell 5 php

给定一个类class RandomName extends CommonAppBase {}是否有任何方法可以自动创建任何类扩展的实例CommonAppBase而无需显式使用new

通常,每个PHP文件只有一个类定义.并且追加new RandomName()到所有文件的末尾是我想要消除的.扩展类没有构造函数; 只CommonAppBase调用构造函数.CommonAppBase->__construct()启动其余的应用程序执行.

奇怪的问题,但如果有人知道解决方案会很好.

编辑

继续下面的评论.执行实例化的代码不在类文件中.类文件就是这样,我想要一些其他代码include('random.class.php')并实例化CommonAppBase那里的扩展类.

对于任何不确定我是什么的人,我的hackish回答做我想要的,但不是以最认真的方式.

在此先感谢,艾登

(顺便说一句,我的PHP版本是5.3.2)请说明任何答案的版本限制.

答案

以下所有内容都可以附加到文件(通过php.ini或Apache),以自动启动特定父类的类.

第一(感谢dnagirl)

$ca = get_declared_classes();
foreach($ca as $c){
    if(is_subclass_of($c, 'MyBaseClass')){
        $inst = new $c();
    }
}
Run Code Online (Sandbox Code Playgroud)

和(接受的答案,作为最接近的答案)

auto_loader();
function auto_loader() {
    // Get classes with parent MyBaseClass
    $classes = array_filter(get_declared_classes(), function($class){
        return get_parent_class($class) === 'MyBaseClass';
    });
    // Instantiate the first one
    if (isset($classes[0])) {
        $inst = new $classes[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

sal*_*the 2

我不确定以下内容是否正是您正在寻找的内容,但这是一个想法。该代码应该是非常不言自明的。

auto_loader();
function auto_loader() {
    // Get classes with parent MyBaseClass
    $classes = array_filter(get_declared_classes(), function($class){
        return get_parent_class($class) === 'MyBaseClass';
    });
    // Instantiate the first one
    if (isset($classes[0])) {
        $inst = new $classes[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这些函数在 PHP 4 的早期就可用,但使用的匿名函数语法array_filter仅在 PHP 5.3.0 中引入。