【问题标题】:How to include a php and then remove it?如何包含一个php然后删除它?
【发布时间】:2012-07-12 21:26:45
【问题描述】:

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

好的,这是我的场景:

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

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

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

提前谢谢你

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

【问题讨论】:

  • 为什么不在pluginA.php 中创建PluginA 类?这样您就可以访问 info 方法 PluginA::Info();(即 OOP)
  • 我有那个选项,但我不知道如何通过这种方式动态实例化一个类,因为我只能获取插件文件名
  • 您将尝试重新定义 PHP 不允许的 info() 函数。所以只有info() 的第一个实例将被定义(插件A),其余的将被忽略。
  • 通常,这应该抛出一个致命的无法重新声明错误。您可以像使用代码一样使用 David 的建议,只需替换 $this->pool[] = info();与 $tmp = 新 $name(); $this->pool[] = $tmp->info();
  • @32bitfloat 是对的!你不能定义相同的方法两次 - 它不会编译!

标签: php file plugins include


【解决方案1】:

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

插件类

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

【讨论】:

  • 不再添加到池中了吗?
  • 如果你想这样做,你可以这样做;)
  • 谢谢@David,很好的解决方案! ...其他人也非常感谢你!
【解决方案2】:

您确定解释器没有因致命错误而窒息吗?应该是因为您在这里尝试两次定义 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 您的函数组,但我仍然推荐池的关联数组,因为您可以在恒定时间内引用插件,而不是线性。

【讨论】:

  • 您应该首先检查文件是否到位以避免运行时错误
  • 是的,这是真的;你和我的答案 FTW 的组合!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多