PHP中基于模块的系统 - 如何?

时间:2011-08-31 12:35:35

标签: 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();

我有一个全局$ 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(){
  }
}

由于我已经获得了相当多的代码,我的问题是 - 是否有一种替代方法可以使所有模块都基于类,这可以避免名称冲突的问题并允许我保持当前模块系统的完整性?

3 个答案:

答案 0 :(得分:3)

OO是去这里的方式。创建一个Module基类,如果需要特定于模块的函数,则扩展它。

如果将类名映射到文件名,您甚至可以使用自动加载器,这样就不必include()所有内容。拥有一个中心Singleton类来跟踪你的模块实例(避免使用全局变量,这是一种不推荐的做法)也很好。

答案 1 :(得分:1)

我觉得像PHP的CommonJS或ES6模块这样的东西会很好。已经有一些想法:https://groups.google.com/forum/#!topic/commonjs/sVkxbQtR-lw

答案 2 :(得分:0)

  1. 基于普通函数的模块系统难以管理 - 使用对象
  2. PHP,因为版本5可以通过名称
  3. 自动加载模块
  4. 使用分层系统 - 从抽象模块或界面,您将知道该模块可以做什么。
  5. 如果您在变量中有名称,则可以创建此类实例 - $foo = new $bar()
  6. 其中$ foo是新实例,$ bar存储对象名称