问题 PHP - 从函数中获取所有参数(甚至是可选参数)


我想从函数中获取所有参数(传递或不传递)。

例:

<?php
    function foo($a, $b=1)
    {
         return $a-$b;
    }
?>

如果我打电话

$test = func_get_args(foo(10));
var_dump($test);

我将只有一个数组 [0] => 10

即使我没有传递它/它们,我怎么能得到可选参数的值? (我知道 func_get_args 只返回传递的参数。)

编辑: 更确切地说,这就是我正在做的事情:

function insertLog($fct_name="-1", $type="-1", $error="-1", ....)
{
     // first thing
     $params = func_get_args();
     var_dump($params);
}

1767
2018-02-13 17:02


起源

我想如果你打电话会有用 func_get_args() 在函数内,不在函数之外。 - Armin
谢谢,我在函数本身内部调用它,我只得到传递的参数 - Stv
你还在使用它吗?它不应该是这样的: func_get_args(foo(10)); 在你的功能。试试这个: print_r(func_get_args()) 再次,没有传递给func_get_args()的参数,它都在你的函数中。 - Armin
我编辑了我的评论,以便更准确地使用它。 - Stv
@robotsushi:作为 的文件 func_get_args() 州: The function returns a copy of the passed arguments only, and does not account for default (non-passed) arguments.。 - Amal Murali


答案:


你可以使用 ReflectionFunction 功能类。

function foo($a, $b=1)
{
    $arr = array();
    $ref = new ReflectionFunction(__FUNCTION__);
    foreach($ref->getParameters() as $parameter)
    {
        $name = $parameter->getName();
        $arr[$name] = ${$name};
    }
    print_r($arr);

    // ...
}

调用功能:

foo(1);

输出:

Array
(
    [a] => 1
    [b] => 1
)

演示


11
2018-02-13 17:12



我会自己搜索,但是这个有一些php版本的限制吗? (并且只是为了获取信息,它不会重新确定参数的真/假状态,但我可以忍受:))再次感谢你。 - Stv
@Stv:它适用于PHP5以上的所有版本。是的,它 能够 检测类型: eval.in/101366 - Amal Murali


func_get_args

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

我已经创建了一个名为func_get_all_args的函数,它利用了这个功能 反射。它返回与func_get_args相同的数组,但包含任何缺少的默认值。

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;
}

用法

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

这可能会带来一些改进,例如ac捕捉和抛出错误。


1
2018-01-19 09:28