1

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

所以基本上,我想在某些类或文件中禁用命名空间。所以new \events\Event();看起来就像new Event();没有namespace events;Event类中删除。

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

4

3 回答 3

2

不,换句话说,这行不通:

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

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

use Plugin\Namespace\Events\MyEventType;

MyEventType无需限定即可引用。当然,这对插件作者来说并不过分吗?

于 2013-02-24T22:07:22.787 回答
1

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

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

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

于 2013-02-24T22:16:13.760 回答
1

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

namespace {
    // this runs in global namespace
}

另请参阅:在同一文件中定义多个命名空间

于 2013-02-24T22:04:26.277 回答