闭包似乎没有完全暴露于反射。作为一个对象进行检查,它似乎没有任何有用的东西:
$foo = function ($a, $b) {};
$ref = new ReflectionObject($foo);
var_dump($ref->getFileName()); // false
可以获取匿名函数的参数:
$invoker = $ref->getMethod('__invoke');
var_dump($invoker->getParameters()); // "a" and "b"!
但不是在定义的地方:
var_dump($invoker->getFileName()); // false
任何想法?
我想你要找的是ReflectionFunction
而不是ReflectionObject
。
这是参考文献。它甚至包括一个isClosure
方法,并接受闭包作为构造函数参数。: -)
的例子:
$callback = function (){ echo 'hello'; };
$r = new ReflectionFunction($callback);
$startLine = $r->getStartLine();
$file = $r->getFileName();
$is_closure = $r->isClosure();