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

4

假设我有一个存储在变量中的可调用对象:

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

我该如何获取“bar”?

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

不幸的是,func_get_args()仅适用于当前函数,是否有可能获取关键字参数对?

3个回答

5
您可以使用反射来实现:

reflection

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

ReflectionFunction 能够用于任何可调用对象吗?(例如类方法和静态方法?) - SparK
1
@SparK 不行,这是我的情况。如果你还需要的话,可以看看我的答案。 - miile7

2

我发现这个问题是因为我正在寻找获取可调用对象参数的方法,而不仅仅是函数本身。我的情况是

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

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

这是 PHP 中有效的回调函数。在这种情况下,@Marek 给出的解决方案不起作用。
我使用了 PHP 的 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();
// ...

即使 $name 始终使用 :: (有一些例外情况),此函数也返回 ReflectionFunctionAbstract::isStatic() 的正确值。
注意:在PHP>=7.0中,使用Closures可能会更容易。在那里,你可以做类似的事情。
$closure = Closure::fromCallable($callable);

$r = new ReflectionFunction($closure);

你可能还需要区分ReflectionFunctionReflectionMethod,但我无法测试,因为我没有使用PHP>=7.0。

1
你可以使用get_defined_vars来实现这个功能,该函数会返回一个包含所有已定义变量的数组,通过访问输出数组中的callable索引来获取具体信息。

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