服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

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

时间:2016-06-20 08:45来源:未知 作者:最模板 点击:
namespace(命名空间)在 PHP 符号表中的表现只是增加了一个命名前缀,如 Azalea\foo,因此在定义PHP_FE或PHP_ME时,只需要修改注册入符号表中的名称即可。 命名空间声明 为了方便以后类和

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

(责任编辑:最模板)
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容