本文共 1850 字,大约阅读时间需要 6 分钟。
最近在看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.
转载地址:https://blog.csdn.net/weixin_33952775/article/details/115987384 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!