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方法的功能。

有一篇文章写的很好:

PHP7扩展开发之Hello World

https://www.cnblogs.com/server-dev/p/5198498.html

文中已经详细介绍了如何创建一个扩展和提供了源码下载。

所以代码实现

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, &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);
}

未经允许不得转载:前后端 » PHP7扩展开发之函数调用

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址