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

php中文网
发布: 2016-06-13 10:28:47
原创
1276人浏览过

如何在扩展里调用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

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号