PHP中基于模块的系统-如何使用?
我有一个PHP web应用程序,其中我制作了一个小模块系统,基本上是这样工作的:PHP中基于模块的系统-如何使用?,php,class,module,Php,Class,Module,我有一个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(); 每个模块都有自己的文件,文件名
$MODULE["name"] = "some_module";
$MODULE["description"] = "This module does some things";
$MODULE["required"] = false;
$MODULE["module_specific_var"] = some_function_that_returns_some_value();
每个模块都有自己的文件,文件名可以是任何东西,但并不重要(为了逻辑起见,我将文件名命名为与模块名相同)。模块的内容可以如下所示:
$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\u of_module”][“name\u 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(){
}
}
因为我已经有了相当多的代码,所以我的问题是-是否有一种替代方法可以使所有模块都基于类,从而避免名称冲突的问题,并允许我保持当前模块系统的完整性?OO是一种方法。制作一个模块
基类,如果您需要特定于模块的函数,则扩展该基类
如果将类名映射到文件名,甚至可以使用自动加载程序,这样就不必include()
所有内容。有一个中心类来跟踪模块实例也很好(以避免使用globals,这是一种不推荐的做法)
基于普通函数的模块系统很难成为可维护使用的对象
PHP自版本5起就可以按其名称自动加载模块
使用分层系统-从抽象模块或接口,您将知道这个模块可以做什么
如果变量中有name,则可以像这样创建实例-$foo=new$bar()
其中$foo是新实例,$bar存储对象名我认为像CommonJS或用于PHP的ES6模块这样的东西会很好。已经有了一些想法:您不应该依赖globals变量,因此,您希望将数据和方法封装在某种结构中。。有点像“物体”,如果可以的话。。现在,您可以使用什么PHP5功能来实现这一点。。六羟甲基三聚氰胺六甲醚。。棘手的如果我是你,我会把面向模块的体系结构重写为面向对象的。您已经命名的方法有一个问题=名称冲突和全局范围过多。您可以通过使用名称空间(PHP5.3中新增的名称空间)来推迟问题,但这并不能解决问题。您有什么要求强制您重写名称空间?简单的惰性:P只是想在重写代码之前检查是否有其他方法。这不是模块系统,只是扩展了一些基类。我认为像CommonJS或ES6模块(用于JavaScript)但在PHP中完成的东西将是最好的选择!像这样的想法:1。不,没有。这取决于每个项目的成本。在不知道自己在做什么的情况下使用OOP是不好的。