我遇到了这个问题,因为我正在寻找可调用的参数,而不仅仅是函数本身。我的情况是
class MyClass{
public function f(){
// do some stuff
}
}
$myclass = new MyClass();
$callable = array($myclass, "f);
这是 php.ini 中的有效回调。在这种情况下,@Marek 给出的解决方案不起作用。
我使用了 phps is_callable 函数。您可以使用第三个参数获取函数的名称。然后你必须检查你的回调是一个函数还是一个(类/对象)方法。否则Reflection-classes 会搞砸。
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);
您可能还需要区分ReflectionFunction 和ReflectionMethod,但我无法对此进行测试,因为我没有使用 PHP>=7.0。