如何检查php中的闭包?

Ben*_*ird 6 php closures php-closures php-5.5

我有一个正在传递闭包的函数。我想找出闭包派生自的方法的名称。当我调用print_r时,它输出:

Closure Object
(
  [static] => Array
    (
      [listener] => Event_Subscriber_Calq@vendor_product_created
      [container] => Illuminate\Foundation\Application Object
...
Run Code Online (Sandbox Code Playgroud)

我如何访问该侦听器值?我试过 ->static、::$static、getStatic(),我想不出任何方法来获取值。

目前,我的计划是使用输出缓冲来捕获 var_dump 的输出。我不能为此使用 print_r,因为闭包包含对引用自身的对象的引用,而 print_r 需要很长时间来处理递归。我也不能使用 var_export,因为它没有在输出中包含我想要的值。所以,这是我的解决方案:

ob_start();
var_dump($closure);
$data = ob_get_clean();
$data = preg_replace('#^([^\n]*\n){4}#', '', $data);
$data = preg_replace('#\n.*#', '', $data);
$data = preg_replace('#.*string.[0-9]+. "(.*)".*#', '\1', $data);
list($class, $method) = explode('@', $data);
Run Code Online (Sandbox Code Playgroud)

这是可怕的。有没有另一种方法可以做到这一点?也许使用反射?

小智 5

我知道这篇文章很旧,但如果有人在寻找信息,你需要使用 ReflectionFunction:

$r = new ReflectionFunction($closure);
var_dump($r, $r->getStaticVariables(), $r->getParameters());
Run Code Online (Sandbox Code Playgroud)

问候,亚历克斯