前言在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下: <?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扩展上增加 代码实现
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);
}代码解读参数的接受之前有过文章详细说明过,这里就不再说了。这次我们主要说下
* 第一个参数:方法表。通常情况下,写 * 第二个参数:对象。如果不是调用对象的方法,而是调用函数,填写NULL * 第三个参数:方法名。 * 第四个参数:返回值。 * 第五个参数:参数个数。 * 第六个参数:参数值。是一个zval数组。 * 第七个参数:参数是否进行分离操作。详细的,你可以搜索下 PHP 参数分离。查看相关文章 * 第八个参数:符号表。一般情况写设置为NULL即可。 源码下载![]() |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|