php扩展调用php函数,PHP7扩展开发之函数调用

前言

在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下:<?php

class demo{

public function get_site_name ($prefix){

return $prefix."信海龙的博客\n";

}

}

function get_site_url ($prefix){

return $prefix."www.bo56.com\n";

}

function call_function ($obj, $fun, $param){

if ($obj == null) {

$result = $fun($param);

} else {

$result = $obj->$fun($param);

}

return $result;

}

$demo = new demo();

echo call_function($demo, "get_site_name", "site name:");

echo call_function(null, "get_site_url", "site url:");

?>

我们将要使用扩展实现call_function方法的功能。

代码

基础代码

这个扩展,我们将在say扩展上增加 call_function() 。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

代码实现

call_function 的源码如下:PHP_FUNCTION(call_function)

{

zval *obj = NULL;

zval *fun = NULL;

zval *param = NULL;

zval retval;

zval args[1];

#ifndef FAST_ZPP

/* Get function parameters and do error-checking. */

if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzz", &obj, &fun, ¶m) == FAILURE) {

return;

}

#else

ZEND_PARSE_PARAMETERS_START(3, 3)

Z_PARAM_ZVAL(obj)

Z_PARAM_ZVAL(fun)

Z_PARAM_ZVAL(param)

ZEND_PARSE_PARAMETERS_END();

#endif

args[0] = *param;

if (obj == NULL || Z_TYPE_P(obj) == IS_NULL) {

call_user_function_ex(EG(function_table), NULL, fun, &retval, 1, args, 0, NULL);

} else {

call_user_function_ex(EG(function_table), obj, fun, &retval, 1, args, 0, NULL);

}

RETURN_ZVAL(&retval, 0, 1);

}

代码解读

参数的接受之前有过文章详细说明过,这里就不再说了。这次我们主要说下 call_user_function_ex 方法的使用。

call_user_function_ex 方法用于调用函数和方法。参数说明如下:

* 第一个参数:方法表。通常情况下,写 EG(function_table) 更多信息查看 http://www.bo56.com/php7%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bcg%E5%92%8Ceg/

* 第二个参数:对象。如果不是调用对象的方法,而是调用函数,填写NULL

* 第三个参数:方法名。

* 第四个参数:返回值。

* 第五个参数:参数个数。

* 第六个参数:参数值。是一个zval数组。

* 第七个参数:参数是否进行分离操作。详细的,你可以搜索下 PHP 参数分离。查看相关文章

* 第八个参数:符号表。一般情况写设置为NULL即可。

源码下载

Tag标签:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值