日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

[php-src]扩展中封装业务与 call_user_function 的使用建议

發布時間:2025/7/14 php 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [php-src]扩展中封装业务与 call_user_function 的使用建议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內容均以php5.6.14為例.

?

從一個封裝 uniqid 的例子來講。

/* {{{ wrapper of uniqid */ PHP_FUNCTION(fox) {
// #1.zval
*prefix, *more = NULL;zval function, *params[2] = {0};// #2.if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z", &prefix, &more) == FAILURE ) {RETURN_FALSE;}params[0] = prefix;if (more) {params[1] = more;}// #3.ZVAL_STRING(&function, "uniqid", 0);
// #4.if ( call_user_function(EG(function_table), NULL, &function, return_value, ZEND_NUM_ARGS(), params TSRMLS_CC) == FAILURE ) {if (return_value) {zval_dtor(return_value);}zend_error(E_WARNING, "%s() calling %s() failed.", get_active_function_name(TSRMLS_C), Z_STRVAL(function));RETURN_FALSE;}RETURN_STRING(Z_STRVAL_P(return_value), 0); } /* }}} */

?

#1.

zval 不賦值默認是非空,不要隨意給 聲明的 zval 賦值為 NULL,除非你知道自己在干什么,比方用在判斷是否有傳參;

?

如果你想對可選的參數使用默認值 farwish,可以像下面這樣 (非用于上例):

if (more == NULL) {MAKE_STD_ZVAL(more);Z_STRVAL_P(more) = "farwish";Z_STRLEN_P(more) = strlen("farwish");Z_TYPE_P(more) = IS_STRING; } params[1] = more;

還有別忘了 call_user_function 中的參數個數就不能再用 ZEND_NUM_ARGS(),寫固定值 2 就可以了。

?

#2.

接收的參數類型必須用雙引號包裹,為了避免其它地方也遇到這種錯誤,最好后面統一都用雙引號。

如果接收的參數含 char *name 類型的, 別忘了要有 uint *len 跟在它后面傳入。

?

#3. #4.

如果開頭聲明的是 zval *function, 并且 ZVAL_STRING 賦值 和 call_user_function 的調用都傳 function, 編譯能通過, 但是使用會segmentaion fault;測試證明, ZVAL_STRING 第一個參數一定是指向 zval 的地址, 而不是簡單的傳 zval *, 因為宏中做了 zval *__z = (z) 這么一件事, 如果 z 已經是指針, 那么值就不對了.

?

./Zend/zend_execute_API.c:575

int call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC)

zval function_name, retval_ptr;

?

Thats all.

?

開發文檔:https://github.com/farwish/php-core-hack

Link:http://www.cnblogs.com/farwish/p/5635429.html

總結

以上是生活随笔為你收集整理的[php-src]扩展中封装业务与 call_user_function 的使用建议的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。