我有一个PHP Web应用程序,我已经制作了一个小模块系统,基本上是这样的:
每个模块都有自己的文件,文件名可以是任何东西,但无关紧要(为了逻辑起见,我命名的文件名与模块名称相同)。模块的内容可能如下所示:
$MODULE["name"] = "some_module";
$MODULE["description"] = "This module does some things";
$MODULE["required"] = false;
$MODULE["module_specific_var"] = some_function_that_returns_some_value();
我有一个全局$ MODULES数组,我将所有模块读入:
foreach ($modules_list as $module_filename){
if (isset($MODULE)) unset($MODULE);
include($module_path."/".$module_filename);
$MODULES[$MODULE["name"]] = $MODULE;
}
现在这非常简单,已经足以满足我的需求......直到现在......现在我需要一个特定于模块的功能,并且不能使用关联数组(据我所知)。我想要的是能够拨打$MODULES["name_of_module"]["name_of_module_specific_function"]();
我知道这可以通过函数引用实现,只要我对每个模块使用include()
,模块文件中定义的任何函数都可以在全局空间中使用 - 这可能会导致命名问题,所以很糟糕想法。
或者,我将每个模块都设为一个类,类似于:
class module_name {
var $name = "some_module";
var $description = "This module does some things";
var $required = false;
var $module_specific_var = some_function_that_returns_some_value();
function module_specific_function(){
}
}
由于我已经获得了相当多的代码,我的问题是 - 是否有一种替代方法可以使所有模块都基于类,这可以避免名称冲突的问题并允许我保持当前模块系统的完整性?
答案 0 :(得分:3)
OO是去这里的方式。创建一个Module
基类,如果需要特定于模块的函数,则扩展它。
如果将类名映射到文件名,您甚至可以使用自动加载器,这样就不必include()
所有内容。拥有一个中心Singleton类来跟踪你的模块实例(避免使用全局变量,这是一种不推荐的做法)也很好。
答案 1 :(得分:1)
我觉得像PHP的CommonJS或ES6模块这样的东西会很好。已经有一些想法:https://groups.google.com/forum/#!topic/commonjs/sVkxbQtR-lw
答案 2 :(得分:0)
$foo = new $bar()
其中$ foo是新实例,$ bar存储对象名称