将PHP可调参数作为数组获取?

时间:2015-01-26 11:11:29

标签: php arguments callable-object

假设我有一个可调用的存储为变量:

$callable = function($foo = 'bar', $baz = ...) { return...; }

我怎么会得到'酒吧'?

if (is_callable($callable)) {
  return func_get_args();
}

不幸的是func_get_args()用于当前函数,是否可以获得一对键值参数?

3 个答案:

答案 0 :(得分:3)

您可以使用reflection

$f = new ReflectionFunction($callable);
$params = $f->getParameters();
echo $params[0]->getDefaultValue();

答案 1 :(得分:1)

您可能希望使用get_defined_vars来完成此操作,此函数将返回所有已定义变量的数组,特别是通过从输出数组访问callable索引。

答案 2 :(得分:1)

我遇到了这个问题,因为我一直在寻找可调用的参数,而不仅仅是函数本身。我的情况是

class MyClass{
    public function f(){
        // do some stuff
    }
}

$myclass = new MyClass();
$callable = array($myclass, "f);

这是php中的有效回调。在这种情况下,由@Marek提供的解决方案不起作用。

我使用phps is_callable功能。您可以使用第三个参数获取函数的名称。然后你必须检查你的回调是函数还是(类/对象)方法。否则Reflection - 类会搞乱。

if($callable instanceof Closure){
    $name = "";
    is_callable($callable, false, $name);

    if(strpos($name, "::") !== false){
        $r = new ReflectionMethod($name);
    }
    else{
        $r = new ReflectionFunction($name);
    }
}
else{
    $r = new ReflectionFunction($callable);
}

$parameters = $r->getParameters();
// ...

即使ReflectionFunctionAbstract::isStatic()始终使用通常表示静态函数的$name(有一些例外),这也会返回::的正确值。

注意:在PHP> = 7.0中,使用Closures可能会更容易。在那里你可以做点像

$closure = Closure::fromCallable($callable);

$r = new ReflectionFunction($closure);

您可能还必须区分ReflectionFunctionReflectionMethod,但我无法对此进行测试,因为我没有使用PHP> = 7.0。