PHP - 获取函数中的所有参数(包括可选参数)

12

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

例如:

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

2
我认为如果你在函数内部调用func_get_args()而不是在函数外部调用,它会起作用。 - Armin
谢谢,我在函数内调用它,只得到了传递的参数。 - Stv
2
你还在像上面那样使用它吗?在你的函数中,它不应该看起来像这样:func_get_args(foo(10));。相反,尝试这个:print_r(func_get_args()),再次调用时不传递任何参数给func_get_args(),并且所有操作都在你的函数内部完成。 - Armin
我编辑了我的评论,以更准确地说明我使用它的方式。 - Stv
1
func_get_args()文档所述:该函数仅返回传递的参数的副本,并不考虑默认(未传递)参数。 - Amal Murali
2个回答

12
你可以使用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
)

演示


我会自己搜索,但是这个有一些PHP版本的限制吗?(仅供参考,它不识别参数的true/false状态,但我可以接受:))再次感谢您。 - Stv
1
@Stv: 它适用于PHP5以上的所有版本。而且,是的,它可以检测类型:https://eval.in/101366 - Amal Murali

2

func_get_args

注意:本函数仅返回传递的参数副本,不包括默认(未传递)参数。

我创建了一个名为 func_get_all_args 的函数,它利用 Reflection。它返回与 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);
}

这段内容可能需要进一步改进,例如捕获和处理错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接