好吧,我不知道这篇文章是否有正确的标题。随意改变它。
好的,这是我的情景:
pluginA.php
function info(){
return "Plugin A";
}
pluginB.php
function info(){
return "Plugin B";
}
最后,我有一个插件管理器负责将所有插件信息导入池数组:
的 Manager.php
class Manager
{
protected $pool;
public function loadPluginsInfo()
{
$plugin_names = array("pluginA.php", "pluginB.php");
foreach ($plugin_names as $name)
{
include_once $name;
$this->pool[] = info();
}
}
}
这里的问题是,当我打印池数组时,它只显示加载的第一个插件的信息。我认为文件包含覆盖了信息,因为它仍然从第一个include中调用info()方法。
有没有办法在所有插件文件中包含具有相同名称的info()函数的插件的信息?
提前谢谢
PS:致命的不能重新声明错误永远不会被抛出答案 0 :(得分:2)
您可以使用动态方式创建插件类
插件类
class PluginA
{
public function info()
{
return 'info'; //the plugin info
}
}
经理班
class Manager
{
protected $pool;
public function loadPluginsInfo()
{
$plugin_names = array("pluginA", "pluginB"); //Plugin names
foreach ($plugin_names as $name)
{
$file = $name . '.php';
if(file_exists($file))
{
require_once($file); //please use require_once
$class = new $name(/* parameters ... */); //create new plugin object
//now you can call the info method like: $class->info();
}
}
}
}
答案 1 :(得分:1)
你确定解释器没有因致命错误而窒息吗?应该是因为你试图在这里定义info
函数两次。
有很多方法可以达到你想要的效果,就像上面@ David的评论中使用的一样,例如。
class PluginA
{
function info() { return 'Plugin A'; }
}
class PluginB
{
function info() { return 'Plugin B'; }
}
那么Manager类就是这样的:
class Manager
{
protected $pool;
public function loadPluginsInfo()
{
$plugin_names = array("PluginA", "PluginB");
foreach ($plugin_names as $name)
{
include_once $name . '.php';
$this->pool[] = new $name();
}
}
}
现在您已经加载了每个插件类的实例,因此要获取插件的信息,您将获得第一个插件的$this->pool[0]->info();
。我建议使用关联数组,这样你就可以轻松引用给定的插件。为此,对池的分配将变为:
$this->pool[$name] = new name();
然后你可以说:
$this->pool['PluginA']->info();
例如。
还有很多其他方法可以做到这一点。现在5.3是主流你可以很容易namespace你的函数组,但我仍然会推荐池的关联数组,因为你可以在恒定时间内引用一个插件,而不是线性。