嗯,我不知道这篇文章的标题是否正确。请随意更改。
好的,这是我的场景:
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();
}
}
}
这里的问题是,当我打印池数组时,它只显示加载的第一个插件的信息。我认为including文件覆盖了info,因为它仍然从第一个include调用info()方法。
有没有一种方法可以为所有插件文件包含具有相同名称的info()函数的两个插件的信息?
提前感谢
PS:致命的无法重新声明错误从未抛出
您可以使用动态方式创建插件类
插件类
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();
}
}
}
}
您确定解释器没有因为致命错误而窒息吗?应该是因为您在这里尝试定义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已经成为主流,你可以很容易地为函数组命名名称,但我仍然建议为池使用关联数组,因为你可以在恒定时间内引用插件,而不是线性的。