PHP7拡張機能で名前空間に関数とクラスを定義する方法

WBOY
リリース: 2016-06-23 09:09:40
オリジナル
1249 人が閲覧しました

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
ログイン後にコピー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート