【php7扩展开发五】函数调用
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                【php7扩展开发五】函数调用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                實際應用中,擴展可能需要調用用戶自定義的函數或者其他擴展定義的內部函數,PHP提供的函數調用API的使用:
ZEND_API int call_user_function(HashTable *function_table, zval *object,zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[ ]);
 各參數的含義:
__function_table:__ 函數符號表,普通函數是EG(function_table),如果是成員方法則是zend_class_entry.function_table
 object: 調用成員方法時的對象
 __function_name:__ 調用的函數名稱
 __retval_ptr:__ 函數返回值地址
 __param_count:__ 參數數量
 params: 參數數組
 從接口的定義看其使用還是很簡單的,不需要我們關心執行過程中各階段復雜的操作。下面從一個具體的例子看下其使用:
(1)在PHP中定義了一個普通的函數,將參數$i加上100后返回:
function mySum($i){return $i+100; }(2)接下來在擴展中調用這個函數:
PHP_FUNCTION(my_func_2) {zend_long i;zval call_func_name, call_func_ret, call_func_params[1];uint32_t call_func_param_cnt = 1;zend_string *call_func_str;char *func_name = "mySum";if(zend_parse_parameters(ZEND_NUM_ARGS(), "l", &i) == FAILURE){RETURN_FALSE;}//分配zend_string:調用完需要釋放call_func_str = zend_string_init(func_name, strlen(func_name), 0);//設置到zvalZVAL_STR(&call_func_name, call_func_str);//設置參數ZVAL_LONG(&call_func_params[0], i);//callif(SUCCESS != call_user_function(EG(function_table), NULL, &call_func_name, &call_func_ret, call_func_param_cnt, call_func_params)){zend_string_release(call_func_str);RETURN_FALSE;}zend_string_release(call_func_str);RETURN_LONG(Z_LVAL(call_func_ret)); }
 (3)最后調用這個內部函數:
 call_user_function() 并不是只能調用PHP腳本中定義的函數,內核或其它擴展注冊
 的函數同樣可以通過此函數調用,比如:array_merge()。
 ?
 ?
總結
以上是生活随笔為你收集整理的【php7扩展开发五】函数调用的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 【php7扩展开发四】函数的参数 ,引用
 - 下一篇: 【php7扩展开发六】zval的操作