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

WBOY
Lepaskan: 2016-06-23 09:09:40
asal
1249 orang telah melayarinya

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

命名空间声明

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

#define AZALEA_NS "Azalea"#define AZALEA_NS_NAME(name) AZALEA_NS"\\"#name
Salin selepas log masuk

类定义

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

zend_class_entryce;INIT_CLASS_ENTRY(ce, AZALEA_NS_NAME(foo), foo_methods);  // 类名为 Azalea\foo
Salin selepas log masuk

函数定义

函数的定义稍微复杂,因为 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 宏不接受字符串
Salin selepas log masuk

因此我们需要使用 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
Salin selepas log masuk

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan