本文主要是介绍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;}
#elseZEND_PARSE_PARAMETERS_START(3, 3)Z_PARAM_ZVAL(obj)Z_PARAM_ZVAL(fun)Z_PARAM_ZVAL(param)ZEND_PARSE_PARAMETERS_END();
#endifargs[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)
更多信息查看
* 第二个参数:对象。如果不是调用对象的方法,而是调用函数,填写NULL
* 第三个参数:方法名。
* 第四个参数:返回值。
* 第五个参数:参数个数。
* 第六个参数:参数值。是一个zval数组。
* 第七个参数:参数是否进行分离操作。详细的,你可以搜索下 PHP 参数分离。查看相关文章
* 第八个参数:符号表。一般情况写设置为NULL即可。
源码下载
tar.gz格式下载
zip格式下载
原文地址:PHP7扩展开发之函数调用
这篇关于PHP7扩展开发之函数调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!