如何在扩展里调用PHP函数呢?
来源:互联网 发布:冈本多绪半裸 知乎 编辑:程序博客网 时间:2024/05/21 17:23
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。
本文地址:http://imsiren.com/archives/606
在写扩展的时候,
肯定不能什么功能都自己实现,原因有很多,开发效率、性能问题、维护成本等。
这就避免不了要在扩展里调用PHP内核函数。
那么如何在扩展里面使用我们的内置函数呢?
PHP既然有函数,肯定提供了调用函数的接口,
这里有两个函数:
ZEND_API int call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC);
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_separation, HashTable *symbol_table TSRMLS_DC);
很可惜,只找到声明的地方,没有找到注释的地方,
从声明来看,call_user_function 封装了call_user_function_ex,
少了两个传参:
int no_separation:这个的用意就是是否对zval进行分离,不过此功能现在已经不用了,如果设为1则直接会出错,分离的作用是为了优化空间。
symbol_table :是干吗用的,确实目前还不知道。
HashTable* function_table: 函数表,我们都知道 用户函数也好,其他内置函数也好都会存在hashtable里面,function_table会保存所有内置函数和用户函数,用CG来获取,因为函数表属于是 编译全局变量。
zval **object_pp:这个是用来我们调用类里的某个方法的对象,看到这里,你恍然大悟没有,调用普通函数和调用类的方法是同一个,
function_table和object_pp只需要一个就可以了。
zval **retval_ptr_ptr:是函数的返回值。
zend_uint param_count:函数/方法 的参数个数
zval **params[] :函数/方法的参数指针。
那么清楚了两个API的参数及调用方法之后,我们来测试一下,究竟如何来使用。
首先 创建一个 扩展文件
/ext/ext_skel –extname=call_func
修改config.m4
在php_call_func.h中添加
PHP_FUNCTION(siren_call);做一个声明
打开call_func.c
这样,我们编译之后,就建好了一个扩展,
siren_call接收两个参数,第一个是需要调用的函数名,第二个是传给函数的参数。这里只是一个简单的zval类型
使用方法如下
这样 就会输出 my name is siren;
怎么样 是不是很简单。
原文出处:http://imsiren.com/archives/606
欢迎转载,转载请注明出处 。
本文地址:http://imsiren.com/archives/606
在写扩展的时候,
肯定不能什么功能都自己实现,原因有很多,开发效率、性能问题、维护成本等。
这就避免不了要在扩展里调用PHP内核函数。
那么如何在扩展里面使用我们的内置函数呢?
PHP既然有函数,肯定提供了调用函数的接口,
这里有两个函数:
ZEND_API int call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC);
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_separation, HashTable *symbol_table TSRMLS_DC);
很可惜,只找到声明的地方,没有找到注释的地方,
从声明来看,call_user_function 封装了call_user_function_ex,
少了两个传参:
int no_separation:这个的用意就是是否对zval进行分离,不过此功能现在已经不用了,如果设为1则直接会出错,分离的作用是为了优化空间。
symbol_table :是干吗用的,确实目前还不知道。
HashTable* function_table: 函数表,我们都知道 用户函数也好,其他内置函数也好都会存在hashtable里面,function_table会保存所有内置函数和用户函数,用CG来获取,因为函数表属于是 编译全局变量。
zval **object_pp:这个是用来我们调用类里的某个方法的对象,看到这里,你恍然大悟没有,调用普通函数和调用类的方法是同一个,
function_table和object_pp只需要一个就可以了。
zval **retval_ptr_ptr:是函数的返回值。
zend_uint param_count:函数/方法 的参数个数
zval **params[] :函数/方法的参数指针。
那么清楚了两个API的参数及调用方法之后,我们来测试一下,究竟如何来使用。
首先 创建一个 扩展文件
/ext/ext_skel –extname=call_func
修改config.m4
在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;
怎么样 是不是很简单。
原文出处:http://imsiren.com/archives/606
- 如何在扩展里调用PHP函数呢?
- 如何在扩展里调用PHP函数呢?
- WIN下如何在PHP扩展里打开openssl支持?
- 【PHP扩展开发必备】在PHP扩展中通过C语言调用PHP函数与方法
- 菜鸟学php扩展 之 实战如何在扩展里调第三方函数(标准库/原生/自己写的)(六)
- 在C#里如何调用标准DLL函数
- 如何在类里调用MXML内声明的函数
- 如何在c里调用c++的类函数
- 如何在javascript里调用asp的函数
- 如何在统计图超链接里调用JavaScript函数
- 在PHP扩展中通过C语言调用PHP函数与方法
- 利用php调用C语言 扩展函数
- 利用php调用C语言 扩展函数
- PHP扩展开发-07-函数调用
- 如何在Xcode里锁定文件不让别人编辑呢
- 在form中调用另一个form的方法,函数:fnd_function.execute 如何在form1中调用form2呢?可以使用函数fnd_function.execute。其函数定义如下: fn
- 如何在JS里调用另一个JS
- 在构造函数里不能调用shared_from_this()
- Oracle Database常用补丁集Patch号
- XP上IIS发布网站,使得局域网可访问的一些经验。
- Tomcat源码分析(一):环境的搭建
- 苹果面试8大难题及答案
- Android多线程与同步- 笔记
- 如何在扩展里调用PHP函数呢?
- JS重定向的几种方法
- ThumbnailUtils - Android2.2新增类
- 设计模式(1) 单例模式
- 给IT新男的15点建议:苦逼程序员的辛酸反省与总结
- 积跬步以行千里
- 【杂牌互联网产品观察员的一天】想做技术,从观察开始,从坚持开始,从写技术博客开始!
- cpu控制器
- AVI文件格式解析2