1

多くのプラグインを含むフォルダーがあります。各プラグインには同じ名前のクラスが含まれていますが、内容は異なります。

plugin01.php

class Plugin{
  public function get($a){
    return 'Plugin01 - '.$a;
  }
}

plugin02.php

class Plugin{
  public function get($a){
    return 'Plugin02 - '.$a;
  }
}

Plugins.php で、このプラグインをロードしたい。しかし、一度だけではありません。

class Plugins{
  public static function load($id){
    require $id.'.php';
    
    $plugin = new Plugin();
    return $plugin->get('test');
  }
}

echo Plugins::load('plugin01')."\n";
echo Plugins::load('plugin02')."\n";
echo Plugins::load('plugin01');

期待される結果:

Plugin01 - テスト

Plugin02 - テスト

Plugin01 - テスト

現在の結果:

致命的なエラー: クラス プラグインを再宣言できません

私はredefiningクラス名でありincluding、何度も同じプラグインであるため、これは間違いなく機能しません。

私の質問は、ファイルを関数スコープ (外部ファイルで定義されたすべてのクラスを含む) にのみ含めることはできますか?

PHPでそれを行うことはできますか、それともクラスごとに異なる名前を使用する必要がありますか?

4

2 に答える 2

1

一度に 1 つのプラグインしかロードできない場合でも、この方法は機能します。しかし、ご存知のように、同じ名前の複数のクラスで壊れます。

より良い解決策は、 interfacesを使用してから、さまざまなプラグインにそれらのインターフェイスを実装させることだと思います。

したがって、プラグインに必要なすべてのメソッドを含むインターフェースを定義します。

interface Plugin
{
    public function get($a);
}

次に、各プラグインにそれを実装させます。

// Plugin1.php
class Plugin1 implements Plugin
{
    public function get($a)
    {
        return 'Plugin 1 ' . $a;
    }
}

 

// Plugin2.php
class Plugin2 implements Plugin
{
    public function get($a)
    {
        return 'Plugin 2 ' . $a;
    }
}

その後、ほぼ同じ方法でそれらをロードしてインスタンス化できます。

class Plugins{
  public static function load($pluginName){
    require_once( $pluginName.'.php');

    $plugin = new $pluginName();
    return $plugin;
  }
}

$plugin1 = Plugins::load('Plugin1');
echo $plugin1->get('Test');
$plugin2 = Plugins::load('Plugin2');
echo $plugin2->get('Test');
于 2014-08-08T16:09:36.560 に答える
-1

マニュアルから: include 関数

ファイルがインクルードされると、そこに含まれるコードは、インクルードが発生した行の変数スコープを継承します。呼び出しファイルのその行で使用可能な変数は、その時点以降、呼び出されたファイル内で使用できます。ただし、インクルード ファイルで定義されているすべての関数とクラスには、グローバル スコープがあります。

スコープはグローバルであるため、クラスの名前を変更する必要があります。

于 2014-08-08T08:23:01.867 に答える