Home >Backend Development >PHP Tutorial >怎么在扩展里调用PHP函数呢

怎么在扩展里调用PHP函数呢

WBOY
WBOYOriginal
2016-06-13 10:28:471068browse

如何在扩展里调用PHP函数呢?
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。
本文地址: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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn