2012-07-12 47 views
0

嗯,我不知道这个帖子是否有正确的标题。随意改变它。如何包含一个PHP,然后删除它?

好吧,这是我的情景:

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:致命不能重新声明错误从未投掷

+1

为什么不在pluginA.php中创建类'PluginA'?所以你可以访问信息方法'PluginA :: Info();'(这是OOP) – David 2012-07-12 21:29:32

+0

我有这个选项,但我不知道如何动态地通过这种方式动态类,因为我只能得到插件文件名 – manix 2012-07-12 21:31:44

+0

你会试图重新定义PHP不允许的'info()'函数。所以只有'info()'的FIRST实例才会被定义(插件A),其余部分将被忽略。 – 2012-07-12 21:33:05

回答

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

虽然没有更多的添加到池中? – quickshiftin 2012-07-12 21:39:33

+0

如果你想这样做,你可以做到;) – David 2012-07-12 21:40:18

+0

谢谢@David,很好的解决方案! ...其他人也非常感谢你! – manix 2012-07-13 14:57:04

1

你确定口译员不会因为致命错误而ch咽吗?这应该是因为你试图在这里定义info函数两次。

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

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

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

那么管理类将是这样的:

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();为先插入。我建议去w /一个关联数组,虽然这样你可以很容易地引用给定的插件。要做到这一点,分配到池中将成为:

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

然后你就可以说:

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

例如。

还有很多其他的方法来做到这一点。现在5。3是主流,您可以轻松地将您的功能组合在一起,但是我仍然会推荐池的关联数组,因为您可以在常量时间内引用插件,而不是线性。

+1

您应该首先检查文件是否到位以避免运行时错误 – David 2012-07-12 21:41:48

+0

是的,这是真的;你和我的答案FTW的组合! – quickshiftin 2012-07-12 22:35:03

相关问题