如何包含一个PHP,然后删除它?

时间:2012-07-12 21:26:46

标签: php file plugins include

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

好的,这是我的情景:

pluginA.php

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

pluginB.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(); 
        }
    }
}

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

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

提前谢谢

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

2 个答案:

答案 0 :(得分: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();
            }                
        }
    }
}

答案 1 :(得分: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是主流你可以很容易namespace你的函数组,但我仍然会推荐池的关联数组,因为你可以在恒定时间内引用一个插件,而不是线性。

相关问题