1

我有很多插件的文件夹。每个插件包含相同的名称类但不同的内容:

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 做到这一点,还是必须为每个类使用不同的名称?

4

2 回答 2

1

如果您一次只能加载一个插件,那么您的方法就可以了。但是正如您所发现的,它将与多个具有相同名称的类一起中断。

我认为更好的解决方案是使用接口,然后让不同的插件实现这些接口。

因此,使用插件应具有的所有方法定义一个接口:

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');
于 2014-08-08T16:09:36.560 回答
-1

来自手册:包含功能

当一个文件被包含时,它包含的代码继承了包含发生的行的变量范围。从那时起,调用文件中该行的任何可用变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。

所以,你应该重命名你的类,因为范围是全局的。

于 2014-08-08T08:23:01.867 回答