【问题标题】:Can I put PHP extension classes, functions, etc. in a namespace?我可以将 PHP 扩展类、函数等放在命名空间中吗?
【发布时间】:2014-09-01 11:24:28
【问题描述】:

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

namespace MyNamespace{
  class MyClass{
  }
}

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

【问题讨论】:

  • 是的,这很好,但我通常不使用它,因为我坚持每个文件 1 个类。开,别介意我看到了你的其他评论,你可能想添加标题以便更明显。
  • @ArtisiticPhoenix 我不认为你理解我的问题。我知道我可以在 PHP 中做到这一点。我想知道如何在 C 扩展中做到这一点。
  • @murgatroid99 我现在知道了,对不起。 C有标签吗?添加它也可能有帮助。
  • 如果这里提供的任何代码在后期返回错误,你应该复习一下 PHP。你只会结束,在这里备份。这是毫无意义的
  • @DarylGill 我不明白你想说什么。我正在寻找 PHP C 扩展 API 中的函数或宏或其他东西。我已经阅读了文档,它没有关于这个主题的任何内容。

标签: php c php-extension


【解决方案1】:

将一个类放入命名空间非常简单。通常你会在哪里初始化一个类

zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "MyClass", my_class_methods);

把第二行写成

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

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

【讨论】:

  • 感谢您回过头来回答这个问题。我敢肯定,您已经为我节省了 很多 时间来寻找这个答案。
  • 接下来,如果有人仍在寻找类和函数声明的简洁答案:至少从 5.3(引入命名空间时)起,zend_API.h 已经有了宏 ZEND_NS_FEINIT_NS_CLASS_ENTRY 在功能上与它们的非命名空间对应物相同,在函数名称之前有命名空间字符串,例如ZEND_NS_CLASS_ENTRY( ce, "MyNamespace", "MyClass", my_class_methods);
【解决方案2】:

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

我并不是真正的 PHP 内部开发人员,所以我并不完全清楚它是如何工作的,不幸的是,我在网上也能找到非常非常少的信息(我真的让谷歌通过它速度),下面的文章是我能找到的最好的。

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

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

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

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

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

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

【讨论】:

  • 你能给出一个描述/例子来说明如何只使用 C 来做到这一点吗?我不确定如何将该链接中的代码转换为 C API。
  • 这根本不能回答我的问题。它建议使用不同语言的额外库,这显然需要对我的扩展代码进行重大重写才能工作。答案甚至没有解释如何使用该库实现我想要的。
  • 这实际上可能是正确的......我认为这是说您只需将名称空间和反斜杠放入函数/类/您定义的任何名称中?不过,不确定这是否适用于普通的 PHP 扩展。
  • 我以为所有函数都在全局/默认命名空间中
  • 函数不能被命名空间。至少在 PHP 中。 @MartinBarker 建议在 PHP 中实现此目的的正确且唯一的方法:静态命名空间类。如果函数是命名空间的,那么在命名空间中使用核心方法和函数可能会是一种痛苦的体验。
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多