首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使func_get_args &默认值与call_user_func_array一起使用

如何使func_get_args &默认值与call_user_func_array一起使用
EN

Stack Overflow用户
提问于 2016-04-29 11:38:44
回答 2查看 1.3K关注 0票数 3

是否有一个PHP函数可以为我提供传递的参数( 参数)和任何未传递的默认值?

注意:此函数只返回传递参数的副本,而不考虑默认(未传递)参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-29 11:43:04

使用ReflectionFunction

代码语言:javascript
运行
复制
function test($a, $b = 10) {
  echo $a, ' ', $b;
}

$rf = new ReflectionFunction('test');
foreach ($rf->getParameters() as $p) {
  echo $p->getName(), ' - ', $p->isDefaultValueAvailable() ?
    $p->getDefaultValue() : 'none', PHP_EOL;
}
票数 2
EN

Stack Overflow用户

发布于 2016-04-29 12:24:51

我创建了一个名为func_get_all_args的函数,它返回与func_get_args相同的数组,但包含任何缺少的默认值。

代码语言:javascript
运行
复制
function func_get_all_args($func, $func_get_args = array()){

    if((is_string($func) && function_exists($func)) || $func instanceof Closure){
        $ref = new ReflectionFunction($func);
    } else if(is_string($func) && !call_user_func_array('method_exists', explode('::', $func))){
        return $func_get_args;
    } else {
        $ref = new ReflectionMethod($func);
    }
    foreach ($ref->getParameters() as $key => $param) {

        if(!isset($func_get_args[ $key ]) && $param->isDefaultValueAvailable()){
            $func_get_args[ $key ] = $param->getDefaultValue();
        }
    }
    return $func_get_args;
}

用法

代码语言:javascript
运行
复制
function my_function(){

    $all_args = func_get_all_args(__FUNCTION__, func_get_args());
    call_user_func_array(__FUNCTION__, $all_args);
}

public function my_method(){

    $all_args = func_get_all_args(__METHOD__, func_get_args());
    // or
    $all_args = func_get_all_args(array($this, __FUNCTION__), func_get_args());

    call_user_func_array(array($this, __FUNCTION__), $all_args);
}

这可能需要一些改进,如交流捕捉和抛出错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36937399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档