禁用命名空间使用是某些类/文件

时间:2013-02-24 22:01:52

标签: php namespaces

我正在为我的CMS开发一个插件系统,在我的CMS中我经常使用命名空间。 我想要的是插件的开发人员不必在他们的插件中使用命名空间,因为对于之前没有使用过命名空间的开发人员来说,它们可能非常复杂。命名空间的主要问题是可以注册的事件。现在,插件开发人员必须使用use \events\Event;加载Event类,如果他们只是导入类,他们仍然无法使用new Event();,因为它使用名称空间。我想要的是他们可以使用new Event();(类本身将由CMS的自动加载器自动加载,因此不需要包含)。

基本上,我想在某些类或文件中禁用名称空间。因此new \events\Event();看起来只有new Event();,而不会从namespace events;类中移除Event

我希望我解释清楚,我不是最好的解释这种东西。

3 个答案:

答案 0 :(得分:2)

没有。换句话说,这不起作用:

namespace Foo {
    class Event {}
    include('plugin.php');   // plugin.php cannot just do new Event();
}

这应该不是问题,因为你的CMS的插件开发文档应该清楚命名空间的使用,而插件开发人员只需编写类似

的内容
use Plugin\Namespace\Events\MyEventType;

引用MyEventType而无需取得资格。当然,对插件作者的要求不是太多了吗?

答案 1 :(得分:1)

我不确定我是否完全理解,但要在“global”命名空间中运行代码,您可以这样做:

namespace {
    // this runs in global namespace
}

另请参阅:Defining multiple namespaces in the same file

答案 2 :(得分:1)

AFAIK是不可能的,但如果您使用包含所需文件的加载器以便插件作者可以包含loader::load('someclass');的类,您可以让加载器返回带有命名空间的完整类名,插件可以使用它:

$em_classname = Loader::load('eventmanager');
//dymamic use
$em = new $em_classname;
$em->registerEvent();
//static use
$em_classname::registerEvent();

对于动态使用,您甚至可以返回类的实例而不是类名。