ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能開発の基礎を簡単に分析 (3)_PHP チュートリアル

PHP 拡張機能開発の基礎を簡単に分析 (3)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:44:02771ブラウズ

解析参数,这一步通过zend_parse_parameters函数实现,这个函数的作用是从函数用户的输入栈中读取数据,然后转换成相应的函数参数填入变量以供后面核心功能代码使用。zend_parse_parameters的第一个参数是用户传入参数的个数,可以由宏“ZEND_NUM_ARGS() TSRMLS_CC”生成;第二个参数是一个字符串,其中每个字母代表一个变量类型,我们只有一个字符串型变量,所以第二个参数是“s”;最后各个参数需要一些必要的局部变量指针用于存储数据,下表给出了不同变量类型的字母代表及其所需要的局部变量指针。

image

参数解析完成后就是核心功能代码,我们这里只是输出一行字符,php_printf是Zend版本的printf。

最后的返回值也是通过宏实现的。RETURN_TRUE宏是返回布尔值“true”。

使用宏ZEND_BEGIN_ARG_INFO和ZEND_END_ARG_INFO定义参数信息

参数信息是函数所必要部分,这里不做深究,直接给出相应代码:

ZEND_BEGIN_ARG_INFO(arginfo_say_hello_func, 0)    ZEND_END_ARG_INFO()  如需了解具体信息请阅读相关宏定义。

使用宏PHP_FE将函数加入到say_hello_functions中

最后,我们需要将刚才定义的函数和参数信息加入到say_hello_functions数组里,代码如下:

const zend_function_entry say_hello_functions[] = {         PHP_FE(say_hello_func, arginfo_say_hello_func)        {NULL, NULL, NULL}    };  这一步就是通过PHP_EF宏实现,注意这个数组最后一行必须是{NULL, NULL, NULL} ,请不要删除。

下面是编写完成后的say_hello.c全部代码:

/* +------------------------------------------ -----------------------+ | PHP バージョン 5 |       +------------------------------------------------ ----------+ |著作権 (c) 1997-2010 PHP グループ |       +------------------------------------------------ ----------+ |このソース ファイルには、PHP ライセンスのバージョン 3.01 が適用されます。     |これは、ファイル LICENSE 内のこのパッケージにバンドルされており、 |      |次の URL からワールドワイド ウェブを通じて入手できます: |      | http://www.php.net/license/3_01.txt |      | PHP ライセンスのコピーを受け取っておらず、PHP ライセンスのコピーを受け取ることができない場合は、       |ワールドワイド ウェブを通じて入手するには、メモを | までお送りください。       | License@php.net なので、コピーをすぐに郵送できます。               |       +------------------------------------------------ ----------+ |著者: |      +------------------------------------------------ ----------+ */ /* $Id: header 2972​​05 2010-03-30 21:09:07Z johannes ___FCKpd___14nbsp;*/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_say_hello.h" /* php_say_hello でグローバルを宣言した場合。 h これをコメント解除します: ZEND_DECLARE_MODULE_GLOBALS(say_hello) */ /* 真のグローバル リソース - ここではスレッド セーフは必要ありません */ static int le_say_hello;     /* {{{ PHP_FUNCTION */ PHP_FUNCTION(say_hello_func) { char *name;         int name_len;      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { return;         } php_printf("こんにちは %s!", name);       RETURN_TRUE;     } ZEND_BEGIN_ARG_INFO(arginfo_say_hello_func, 0) ZEND_END_ARG_INFO() /* }}} */ /* {{{ Say_hello_functions[] * * ユーザーに表示されるすべての関数には、say_hello_functions[] にエントリが必要です。     */ const zend_function_entry Say_hello_functions[] = { PHP_FE(say_hello_func, arginfo_say_hello_func) {NULL, NULL, NULL} /* Say_hello_functions[] の最後の行である必要があります */ };     /* }}}*/ /* {{{say_hello_module_entry */ zend_module_entry Say_hello_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "say_hello", Say_hello_functions, NULL, NULL, NULL, NULL, PHP_MINFO(say_hello), #if Z END_MODULE_API_NO >= 20010901 "0.1", /* 拡張機能のバージョン番号に置き換えます */ #endif STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_SAY_HELLO ZEND_GET_MODULE(say_hello) #endif /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(say_hello) &nb

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478779.html技術記事パラメーターを解析する。このステップは zend_parse_parameters 関数によって実装されます。この関数の機能は、関数ユーザーの入力スタックからデータを読み取り、それを対応する関数パラメーターに変換し、変数に入力することです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。