0

好吧,我不知道这篇文章的标题是否正确。随意改变它。

好的,这是我的场景:

插件A.php

function info(){
   return "Plugin A";
}

插件B.php

function info(){
   return "Plugin B";
}

最后,我有一个插件管理器,负责将所有插件信息导入池数组:
Manager.php

class Manager
{
    protected $pool;

    public function loadPluginsInfo()
    {
        $plugin_names = array("pluginA.php", "pluginB.php");

        foreach ($plugin_names as $name) 
        {
            include_once $name;
            $this->pool[] = info(); 
        }
    }
}

这里的问题是,当我打印池数组时,它只向我显示加载的第一个插件的信息。我认为包含的文件会覆盖信息,因为它仍然从第一个包含调用 info() 方法。

有没有办法为所有插件文件包含具有相同名称的 info() 函数的两个插件的信息?

先感谢您

PS:致命的无法重新声明错误永远不会被抛出

4

2 回答 2

2

你可以使用动态的方式来创建插件类

插件类

class PluginA
{
    public function info()
    {
        return 'info'; //the plugin info
    }
}

经理班

class Manager
{
    protected $pool;

    public function loadPluginsInfo()
    {
        $plugin_names = array("pluginA", "pluginB"); //Plugin names

        foreach ($plugin_names as $name) 
        {
            $file = $name . '.php';
            if(file_exists($file))
            {
                require_once($file); //please use require_once
                $class = new $name(/* parameters ... */); //create new plugin object

                //now you can call the info method like: $class->info();
            }                
        }
    }
}
于 2012-07-12T21:36:51.150 回答
1

您确定解释器没有因致命错误而窒息吗?应该是因为您尝试在info这里定义该函数两次。

有很多方法可以实现您想要的,如上面@David 的评论中的一种方法是使用类,例如。

class PluginA
{
  function info() { return 'Plugin A'; }
}

class PluginB
{
  function info() { return 'Plugin B'; }
}

那么 Manager 类将是这样的:

class Manager
{
    protected $pool;

    public function loadPluginsInfo()
    {
        $plugin_names = array("PluginA", "PluginB");

        foreach ($plugin_names as $name) 
        {
            include_once $name . '.php';
            $this->pool[] = new $name();
        }
    }
}

现在您已经加载了每个插件类的实例,因此要获取第一个插件的插件信息$this->pool[0]->info();。不过,我建议使用关联数组,以便您可以轻松引用给定的插件。为此,对池的分配将变为:

$this->pool[$name] = new name();

然后你可以说:

$this->pool['PluginA']->info();

例如。

还有很多其他方法可以做到这一点。现在 5.3 是主流,您可以轻松地命名您的函数组,但我仍然建议池的关联数组,因为您可以在恒定时间内引用插件,而不是线性。

于 2012-07-12T21:37:43.037 回答