php扩展 call_user_function,PHP扩展里通过 call_user_function_ex 调用用户空间函数

最近在看YAF的源码,其中可能我认为最关键的应该是在PHP扩展里怎么调用用户空间里的函数了!对于一个framework来说,最基本的功能就是路由到请求对应的Action了。

在PHP扩展里是通过 call_user_function_ex 函数来调用用户空间的函数的。下面我们来分析下这个函数的使用方式吧。

下面这个是call_user_function_ex 函数的定义:

ZEND_API int call_user_function_ex(

HashTable *function_table,

zval **object_pp,

zval *function_name,

zval **retval_ptr_ptr,

zend_uint param_count,

zval **params[],

int no_seperation,

HashTable *symbol_table TSRMLS_DC);

function_table is the hash table where the function you wish to call is located. If you\'re using object_pp, set this to NULL. If the function is global, most likely it\'s located in the hash table returned by the macro CG() with the parameter `function_table\', i.e.

CG(function_table)

object_ppis a pointer to a zval pointer where an initialized object is located. If you use this, set function_table to NULL, as previously noted.

function_name is a pointer to a zval which contains the name of the function in string form.

retval_ptr_ptr is a pointer to a zval pointer which will contain the return value of the function. The zval passed doesn\'t need to be initialized, and it may cause problems if you initialize it when it\'s not neccesary. You

must

always pass a real pointer to a zval pointer, you may not use NULL for this as it will cause a segmentation fault.

param_count is the number of parameters you wish to pass to the function being called.

params is an array of pointers to zval pointers. Note: this is _not_ a PHP/zval array, it is a C array. Example:

zval*foo;zval*bar;zval**params[2];params[0]=&foo;params[1]=bar;

no_seperation is either 1 or 0, 0 being no zval seperation, 1 enabling zval seperation.

symbol_table is the hash table for symbols. I currently don\'t know what this is, so when I find out, I\'ll edit the post and put it here

After the symbol_table parameter, you should put TSRMLS_CC to make it threadsafe.

c7d891e87903ab9e05a0eb4b18dc5c04.png

8330628bf0d454946efd9191f8aafd43.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值