我有很多插件的文件夹。每个插件包含相同的名称类但内容不同:
plugin01.php
class Plugin{
public function get($a){
return 'Plugin01 - '.$a;
}
}
plugin02.php
class Plugin{
public function get($a){
return 'Plugin02 - '.$a;
}
}
在Plugins.php中,我想加载这个插件。但不仅一次。
class Plugins{
public static function load($id){
require $id.'.php';
$plugin = new Plugin();
return $plugin->get('test');
}
}
echo Plugins::load('plugin01')."\n";
echo Plugins::load('plugin02')."\n";
echo Plugins::load('plugin01');
预期结果:
Plugin01 - 测试
Plugin02 - 测试
Plugin01 - 测试
当前结果:
致命错误:无法重新声明类插件
这绝对不起作用,因为我是redefining
类名和including
次插件的次数。
我的问题是,我可以只在函数范围中包含文件(包括在外部文件中定义的所有类),如果不在函数外部出现?
我可以用PHP做,或者我必须为每个类使用不同的名称吗?
答案 0 :(得分:1)
如果您一次只能加载一个插件,那么您的方法就可以了。但是正如你所发现的那样,它会打破多个具有相同名称的类。
我认为更好的解决方案是使用interfaces,然后使用不同的插件实现这些接口。
因此,使用插件应具有的所有方法定义一个接口:
interface Plugin
{
public function get($a);
}
然后让每个插件实现它:
// Plugin1.php
class Plugin1 implements Plugin
{
public function get($a)
{
return 'Plugin 1 ' . $a;
}
}
// Plugin2.php
class Plugin2 implements Plugin
{
public function get($a)
{
return 'Plugin 2 ' . $a;
}
}
然后你几乎可以以相同的方式加载和实例化它们:
class Plugins{
public static function load($pluginName){
require_once( $pluginName.'.php');
$plugin = new $pluginName();
return $plugin;
}
}
$plugin1 = Plugins::load('Plugin1');
echo $plugin1->get('Test');
$plugin2 = Plugins::load('Plugin2');
echo $plugin2->get('Test');
答案 1 :(得分:-1)
来自手册:include function
当包含文件时,它包含的代码将继承发生包含的行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。
因此,您应该重命名您的类,因为范围是全局的。