给定一个类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)
我不确定以下内容是否正是您正在寻找的内容,但这是一个想法。该代码应该是非常不言自明的。
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 中引入。