以下是我将要讨论的代码(在这篇文章中请记住这一点):
文件:index.php
/**
* Base class used when created a new application.
*/
class App {
public function do_something(){
}
}
/**
* Class used, among other things, to manage all apps.
*/
class Apps {
public static function _init(){
foreach(glob('apps/*') as $dir)
if(file_exists($dir.'/index.php')
include_once($dir.'/index.php');
}
}
Apps::_init();
文件:MyApp / index.php
class MyApp extends App {
/**
* This function overrides the the one in App...
*/
public function do_something(){
}
}
所以,你可能知道我在做什么;它是一个应用程序/扩展系统,应用程序保存在/apps/
的单独文件夹中,它的入口点是index.php
。
到目前为止,代码运行良好(或者,它应该,我把它写在我的头顶;))。 无论如何,我的问题是让Apps类知道所有扩展的App类。
简单的方法是在每个应用程序index.php
的末尾写下以下内容。
Apps::register('MyApp'); // for MyApp application
它的问题在于虽然它是可以理解的,但并不是自动化的。 例如,复制+粘贴应用程序需要进行修改,而新开发人员更有可能完全忘记该代码(更糟糕的是,大多数代码在没有它的情况下仍可正常工作!)。
另一个想法是在_init()
:
$apps=array();
foreach(get_declared_classes() as $class)
if(array_search('App',class_parents($class))!==false)
$apps[]=$class;
但这听起来太资源密集,不能持续。
您怎么看?
答案 0 :(得分:0)
注册方法看起来干净简单。后来的维护者(以及你自己)会清楚代码的作用,而且它不容易出错。
答案 1 :(得分:0)
注册方法没问题,你可以做
Apps::register(get_class());
在MyApp
构造函数中,如果有的话。