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 并放入同一目录,例如 plugings

是的,这看起来很乱。

于 2012-12-13T22:55:54.657 回答