在 php_call_func.h 中添加
PHP_FUNCTION(siren_call);做一个声明
打开 call_func.c
重点代码:
PHP_FUNCTION(siren_call){
zval *function_name;
zval* args;
zval* retval;
args=(zval*)malloc(sizeof(zval));
if(zend_parse_parameters(ZEND_NUM_ARGS()
TSRMLS_CC,"zz",&function_name,&args)==FAILURE){
zend_error(E_ERROR,"function requires args");
}
if(function_name->type!=IS_STRING){
zend_error(E_ERROR,"function name must be a string");
}
//call_user_function(`<HashTable *function_table>`,`< zval **object_pp>`,`< zval
*function_name>`,`< zval *retval_ptr>`,`< zend_uint param_count>`,`< zval *params[]
TSRMLS_DC>`)
zval**params=(zval**)malloc(sizeof(zval));
params[0]=args;
if(call_user_function(CG(function_table),NULL,function_name,retval,1,params
TSRMLS_DC)==FAILURE){
zend_error(E_ERROR,"call function failed");
}
*return_value=*retval;
zval_copy_ctor(return_value);
zval_ptr_dtor(&retval);
}
这样,我们编译之后,就建好了一个扩展,siren_call 接收两个参数,第一个是需要
调用的函数名,第二个是传给函数的参数。这里只是一个简单的 zval 类型,使用方法如下:
function test($a){
echo "my name is :".$a;
}
siren_call("test"," siren!\r\n");
这样 就会输出 my name is siren;
怎么样 是不是很简单。