我能否将PHP扩展类、函数等放在命名空间中?

10

我正在用C语言编写一个PHP扩展,我想把我创建的类、函数和变量放在一个命名空间中。但是我在扩展文档中没有找到关于命名空间的任何信息。简而言之,我想要实现以下相当于以下代码:

```php namespace MyNamespace;
class MyClass { // ... }
function myFunction() { // ... } $myVariable = "hello"; ```
namespace MyNamespace{
  class MyClass{
  }
}

但是需要在C扩展中实现。更具体地说,我正在寻找Zend C API中的一个函数或宏,允许我为我在C中编写的类或函数分配一个PHP命名空间。这可能吗?


没问题,那很好,不过我通常不这样做,因为我坚持一个文件只有一个类。哦,算了,我看到你的另一个评论了,你可能想添加标题以使其更加可见。 - ArtisticPhoenix
@ArtisiticPhoenix 我觉得你没有理解我的问题。我知道我可以在PHP中做到这一点。我想知道如何在C扩展中实现它。 - murgatroid99
@murgatroid99,我现在知道了,抱歉。是否有C语言的标签?添加这个可能会有所帮助。 - ArtisticPhoenix
如果这里提供的任何代码在后期返回错误,你应该复习一下PHP。否则你只会回到这里,这是非常无意义的。 - Daryl Gill
@DarylGill,我不明白你想说什么。我正在寻找PHP C扩展API中的函数、宏或其他内容。我已经阅读了文档,但没有关于这个主题的任何内容。 - murgatroid99
2个回答

8
将类放在命名空间中非常简单。通常情况下,您会使用以下方式初始化一个类:
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "MyClass", my_class_methods);

请将第二行改为以下内容:

INIT_CLASS_ENTRY(ce, "MyNamespace\\MyClass", my_class_methods);

命名空间不需要包含在方法声明或my_class_methods数组的成员中,以正确地将它们与类匹配。


感谢您回答这个问题。我相信您刚刚为我节省了很多时间来寻找这个答案。 - ksclarke
在这里跟进一下,如果有人仍在寻找关于类和函数声明的简洁答案:自至少5.3版本(引入命名空间)以来,zend_API.h已经具有宏“ZEND_NS_FE”和“INIT_NS_CLASS_ENTRY”,它们在功能上与非命名空间的对应项相同,只是在函数名之前加上命名空间字符串,例如:“ZEND_NS_CLASS_ENTRY( ce, "MyNamespace", "MyClass", my_class_methods);”。 - John P Bloch

7
要在PHP扩展中使用命名空间,您基本上只需在类或函数名称前面加上前缀。
我不是真正的PHP内部开发人员,所以这方面的细节对我来说并不完全清楚。不幸的是,关于这个问题网上几乎没有什么信息(我真的很用心地搜索了谷歌),下面的文章是我能找到的最好的文章。
然而,它似乎暗示了正确的解决方案,即在使用Zend引擎/PHP内部注册函数时,使用"myNS \\ MyFunc"这样的方式,然后它应该可以从那里定义的myNS中访问。我会尝试一些不同的变化,看看你能走多远。
您最好的选择是在Freenode的#php-internals(如果您可以获得邀请)或PHP邮件列表中提问。
如果您成功找到解决方案,互联网似乎需要一篇好的文章来介绍如何实现这一点。
来源 http://www.php-cpp.com/documentation/namespaces 命名空间不过是类或函数的前缀。如果你想让你的类或函数出现在特定的命名空间中,只需在类或函数名前添加一个前缀即可。...
更新:我更新了我的答案,力图更加清晰明了。很抱歉花费了这么长时间,我最初是在旅途中用手机回复的,本意是回来后回应你的原始评论,但直到收到SO的评论通知我才真正想起它。对此我深表歉意。

这根本不回答我的问题。它建议使用不同语言的额外库,显然需要对我的扩展代码进行重大改写才能工作。而且回答甚至没有解释如何使用那个库来实现我想要的功能。 - murgatroid99
我自己不是 PHP 内部人员,但它似乎的工作方式是带有命名空间的类只需使用 \names\classname 即可。因此,在声明类时,您应该能够将其名称声明为这样才能使其命名空间正常工作。命名空间更多地是为了方便用户使用。因此,\somenamespace\class 可以被同一命名空间中的某些内容使用,只需使用 class 即可缩短其他命名空间中的使用,例如 use \somenamespace\class as someclass - Barkermn01
事实证明,在类的情况下,这比我预期的要简单得多。我的答案给出了详细信息。不幸的是,这个答案并不适用于函数,因此它并不完整。我可能会给你赏金,因为你的答案基本上是正确的,即使它没有解释具体细节。 - murgatroid99
1
我认为所有的函数都在全局/默认命名空间中。 - Barkermn01
1
@DavidScherer 命名空间函数不仅是完全有效的,甚至还被 PHP 手册推荐。 (http://php.net/manual/en/userlandnaming.tips.php) - cmb
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接