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 (责任编辑:最模板) |