💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 前言 在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下: ``` <?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的源码如下: ```c 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, &param) == 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即可。