2012-07-12 49 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

相關問題