0

私のプロジェクトでは、データを処理して結果を処理しています。次のような抽象クラスがあります。

class AbstractInterpreter
{
    public function interprete( $data )
    {
        throw new Exception('Abstract Parent, nothing implemented here');
    }
}

そして、:のさまざまな異なる実装がありAbstractInterpreterます。

class FooInterpreter extends AbstractInterpreter
{
    public function interprete( $data )
    {
        return "resultFoo";
    }
}
class BarInterpreter extends AbstractInterpreter
{
    public function interprete( $data )
    {
        return "resultBar";
    }
}

私の呼び出しコードは、通訳を作成し、結果を収集します。

//this is the data we're working with
$data = "AnyData";

//create the interpreters
$interpreters = array();
$foo = new FooInterpreter();
$bar = new BarInterpreter();
$interpreters[] = $foo;
$interpreters[] = $bar;

//collect the results
$results = array();
foreach ($interpreters as $currentInterpreter)
{
    $results[] = $currentInterpreter->interprete($data);
}

私は現在、ますます多くのインタープリターを作成していて、コードが乱雑になっています...インタープリターごとに、特定のものを追加する必要があり、include_once(..)それをインスタンス化して、に配置する必要があり$interpretersます。

さて、最後に私の質問
をします。特定のディレクトリにあるすべてのインタプリタを自動的に含めてインスタンス化し、それらを?に配置することは可能$interpretersですか?

他の言語では、これはある種のプラグインの概念になります。
私はのさまざまな実装を作成AbstractInterpreterし、それらを特定のサブディレクトリに配置すると、ソフトウェアがそれらを自動的に使用します。終了するとすぐにインタープリターをロードするコードを変更する必要はありません。

4

1 に答える 1

1

自動的に可能かどうかはわかりませんが、数行のコードを記述して同じ結果を得ることができます。

function includeInterpreters($path) {

    $interpreters=array();

    if ($dh = opendir($path)) {
        while (($file = readdir($dh)) !== false) {

            include_once($path.$file);
            $fileNameParts=explode('.', $file);
            $interpreters[]=new $fileNameParts[0];

        }
        closedir($dh);
    }

    return $interpreters;
}

$interpreters= includeInterpreters('/path/plugins');

クラスファイルにInterpreterName.phpという名前を付けて、同じディレクトリに配置します(例:プラグイン)

そして、はい、これは厄介に見えます。

于 2012-12-13T22:55:54.657 に答える