基于PHP7的PHP扩展开发之九(函数调用)

php相关 / 2017年07月29日 21时33分 / 8362人浏览
目的:熟悉在PHP扩展里面如何调用函数,和调用对象的方法。 要使用扩展实现call_function方法的功能,代码示例如下:
$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_user_function_ex方法用于调用函数和方法。参数说明如下: 第一个参数:方法表。通常情况下,写 EG(function_table) 更多信息点击查看 第二个参数:对象。如果不是调用对象的方法,而是调用函数,填写NULL 第三个参数:方法名。 第四个参数:返回值。 第五个参数:参数个数。 第六个参数:参数值。是一个zval数组。 第七个参数:参数是否进行分离操作。详细的,可以看下鸟哥的这篇文章。点击查看。 第八个参数:符号表。一般情况写设置为NULL即可。 扩展中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);
}
想了解其他关于php扩展开发,请访问本系列其他文章。