我可以将PHP扩展类,函数等放在命名空间中吗?

mur*_*d99 10 php c php-extension

我正在用C编写PHP扩展,我想将我在类中创建的类,函数和变量放在命名空间中.我无法在扩展文档中找到有关命名空间的任何内容.要清楚,我想要相当于

namespace MyNamespace{
  class MyClass{
  }
}
Run Code Online (Sandbox Code Playgroud)

但在C扩展名中.更具体地说,我正在寻找Zend C API中的函数或宏,它允许我将PHP命名空间分配给我用C编写的类或函数.这可能吗?

mur*_*d99 8

将类放在命名空间中非常简单.通常你会用一个类初始化一个类

zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "MyClass", my_class_methods);
Run Code Online (Sandbox Code Playgroud)

而是将第二行写为

INIT_CLASS_ENTRY(ce, "MyNamespace\\MyClass", my_class_methods);
Run Code Online (Sandbox Code Playgroud)

的命名空间不需要被包括在所述方法中声明或在成员my_class_methods阵列以适当地与类匹配.


Dav*_*rer 7

要在PHP扩展中使用命名空间,您基本上只是在类或函数名称前面添加前缀.

我不是一个真正的PHP内部开发人员,所以具体细节并不完全清楚我是如何工作的,遗憾的是网上有非常非常少的信息我也可以找到它(我真的让谷歌通过它的步伐),以下文章是我能找到的最好的文章.

但是,似乎这篇文章暗示了正确的解决方案,这似乎是,当您使用Zend引擎/ PHP内部注册函数时,您可以这样做,"myNS\\MyFunc"然后可以从myNS定义的那里访问它.我会用这个尝试一些不同的变化,看看你能走多远.

您最好的选择是在Freenode上的#php-internals中询问(如果您可以获得邀请)或在PHP邮件列表中.

如果你设法找到解决方案,互联网似乎需要一篇关于如何实现这一目标的好文章.

来源http://www.php-cpp.com/documentation/namespaces

命名空间只不过是类或函数前缀.如果您希望您的类或函数出现在特定的命名空间中,您只需要在类或函数名称中添加前缀....

更新:我已经更新了我的答案,试图更清楚.我很抱歉花了这么长时间,我最初在旅行时回复了我的电话,我打算回来并回复你原来的评论,但我真的忘记了它,直到我收到SO的评论通知.我很抱歉.