0

ええと、この投稿のタイトルが正しいかどうかはわかりません。お気軽に変更してください。

わかりました、これは私のシナリオです:

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:致命的なエラーを再宣言することはできません

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ここで関数を2回定義しようとしているためです。

あなたが望むものを達成するための多くの方法があります、上記の@Davidのコメントのように1つの方法はクラスを使用することです、例えば。

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 に答える