background image

  在 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;

 

怎么样 是不是很简单。