PHP7 扩展中如何在 namespace 中定义函数和类

WBOY
Freigeben: 2016-06-23 09:09:40
Original
1249 Leute haben es durchsucht

namespace(命名空间)在 PHP 符号表中的表现只是增加了一个命名前缀,如 ‘Azalea\foo’,因此在定义 PHP_FE或 PHP_ME时,只需要修改注册入符号表中的名称即可。

命名空间声明

为了方便以后类和函数的定义或修改,在头文件中加上定义宏来命名是比较便捷的做法

#define AZALEA_NS "Azalea"#define AZALEA_NS_NAME(name) AZALEA_NS"\\"#name
Nach dem Login kopieren

类定义

在类初始化方法内,只需修改成如下即可定义到命名空间内

zend_class_entryce;INIT_CLASS_ENTRY(ce, AZALEA_NS_NAME(foo), foo_methods);  // 类名为 Azalea\foo
Nach dem Login kopieren

函数定义

函数的定义稍微复杂,因为 PHP_FE宏会把 name 加上 zif_ 前缀来声明内部函数,如

PHP_FE(bar, NULL)  // 此处会在 PHP 中声明 bar 函数,内部函数为 zif_bar // 因此以下两种声明都不合法,编译不通过PHP_FE(Azalea\bar, NULL)  // zif_Azalea\bar 非法内部函数名PHP_FE(AZALEA_NS_NAME(bar), NULL)  // PHP_FE 宏不接受字符串
Nach dem Login kopieren

因此我们需要使用 ZEND_NS_FE或 ZEND_NS_NAMED_FE宏来实现

ZEND_NS_FE(AZALEA_NS, bar, NULL)  // 此处会在 PHP 中声明 Azalea\bar,内部函数为 zif_bar// 然而为了避免内部函数名称重复,我们通常需要重定义内部函数名,如 zif_azalea_bar,因此使用下面这种方式ZEND_NS_NAMED_FE(AZALEA_NS, bar, ZEND_FN(azalea_bar), NULL)  // 内部函数名变为 zif_azalea_bar
Nach dem Login kopieren

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage