我正在为我的CMS开发一个插件系统,在我的CMS中我经常使用命名空间。
我想要的是插件的开发人员不必在他们的插件中使用命名空间,因为对于之前没有使用过命名空间的开发人员来说,它们可能非常复杂。命名空间的主要问题是可以注册的事件。现在,插件开发人员必须使用use \events\Event;
加载Event类,如果他们只是导入类,他们仍然无法使用new Event();
,因为它使用名称空间。我想要的是他们可以使用new Event();
(类本身将由CMS的自动加载器自动加载,因此不需要包含)。
基本上,我想在某些类或文件中禁用名称空间。因此new \events\Event();
看起来只有new Event();
,而不会从namespace events;
类中移除Event
。
我希望我解释清楚,我不是最好的解释这种东西。
答案 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
}
答案 2 :(得分:1)
AFAIK是不可能的,但如果您使用包含所需文件的加载器以便插件作者可以包含loader::load('someclass');
的类,您可以让加载器返回带有命名空间的完整类名,插件可以使用它:
$em_classname = Loader::load('eventmanager');
//dymamic use
$em = new $em_classname;
$em->registerEvent();
//static use
$em_classname::registerEvent();
对于动态使用,您甚至可以返回类的实例而不是类名。