PHP:动态加载插件/模块列表

时间:2012-12-13 22:40:55

标签: php oop plugins

在我的项目中,我正在处理数据并处理结果。有一个抽象类,如下所示:

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的不同实现,将它们放在特定的子目录中,软件自动使用它们。我不必修改一旦完成就加载解释器的代码。

1 个答案:

答案 0 :(得分: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并放入同一目录,例如插件

是的,这看起来很乱。