Maison >développement back-end >tutoriel php >PHP7 扩展中如何在 namespace 中定义函数和类

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

WBOY
WBOYoriginal
2016-06-23 09:09:401275parcourir

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn