将 PHP 个可调用参数作为数组获取?
Get PHP callable arguments as an array?
假设我将一个可调用对象存储为变量:
$callable = function($foo = 'bar', $baz = ...) { return...; }
如何获得 'bar'?
if (is_callable($callable)) {
return func_get_args();
}
很遗憾func_get_args()
是针对当前函数的,是否可以获取键值对参数?
您可能想使用 get_defined_vars 来完成此操作,此函数将 return 一个包含所有已定义变量的数组,特别是通过访问输出数组中的 callable
索引。
您可以使用 reflection:
$f = new ReflectionFunction($callable);
$params = $f->getParameters();
echo $params[0]->getDefaultValue();
我遇到这个问题是因为我正在寻找获取可调用对象的参数,而不仅仅是函数本身。我的情况是
class MyClass{
public function f(){
// do some stuff
}
}
$myclass = new MyClass();
$callable = array($myclass, "f);
这是 php 中的有效回调。在这种情况下,@Marek 给出的解决方案不起作用。
我使用了 phps is_callable
函数。您可以使用第三个参数获取函数的名称。然后你必须检查你的回调是一个函数还是一个(class/object)方法。否则 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();
// ...
这也是 returns ReflectionFunctionAbstract::isStatic()
的正确值,尽管 $name
总是使用 ::
,这通常表示静态函数(有一些例外)。
注意:在 PHP>=7.0 中,使用 Closures
可能更容易。在那里你可以做一些像
$closure = Closure::fromCallable($callable);
$r = new ReflectionFunction($closure);
您可能还需要区分 ReflectionFunction
和 ReflectionMethod
但我无法测试,因为我没有使用 PHP>=7.0.
假设我将一个可调用对象存储为变量:
$callable = function($foo = 'bar', $baz = ...) { return...; }
如何获得 'bar'?
if (is_callable($callable)) {
return func_get_args();
}
很遗憾func_get_args()
是针对当前函数的,是否可以获取键值对参数?
您可能想使用 get_defined_vars 来完成此操作,此函数将 return 一个包含所有已定义变量的数组,特别是通过访问输出数组中的 callable
索引。
您可以使用 reflection:
$f = new ReflectionFunction($callable);
$params = $f->getParameters();
echo $params[0]->getDefaultValue();
我遇到这个问题是因为我正在寻找获取可调用对象的参数,而不仅仅是函数本身。我的情况是
class MyClass{
public function f(){
// do some stuff
}
}
$myclass = new MyClass();
$callable = array($myclass, "f);
这是 php 中的有效回调。在这种情况下,@Marek 给出的解决方案不起作用。
我使用了 phps is_callable
函数。您可以使用第三个参数获取函数的名称。然后你必须检查你的回调是一个函数还是一个(class/object)方法。否则 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();
// ...
这也是 returns ReflectionFunctionAbstract::isStatic()
的正确值,尽管 $name
总是使用 ::
,这通常表示静态函数(有一些例外)。
注意:在 PHP>=7.0 中,使用 Closures
可能更容易。在那里你可以做一些像
$closure = Closure::fromCallable($callable);
$r = new ReflectionFunction($closure);
您可能还需要区分 ReflectionFunction
和 ReflectionMethod
但我无法测试,因为我没有使用 PHP>=7.0.