实际应用中,扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,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;