在我的项目中,我正在处理数据并处理结果。有一个抽象类,如下所示:
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
的不同实现,将它们放在特定的子目录中,软件自动使用它们。我不必修改一旦完成就加载解释器的代码。
答案 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并放入同一目录,例如插件
是的,这看起来很乱。