Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中基于模块的系统-如何使用?_Php_Class_Module - Fatal编程技术网

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

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(); 每个模块都有自己的文件,文件名

我有一个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();
我有一个全局$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是不好的。