Home  >  Article  >  Backend Development  >  PHP7 扩展中如何在 namespace 中定义函数和类

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

WBOY
WBOYOriginal
2016-06-23 09:09:401250browse

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

命名空间声明

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

#define AZALEA_NS "Azalea"#define AZALEA_NS_NAME(name) AZALEA_NS"\\"#name

类定义

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

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

函数定义

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

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn