6

Closure が渡される関数があります。クロージャーが派生したメソッドの名前を知りたいです。print_r を呼び出すと、次のように出力されます。

Closure Object
(
  [static] => Array
    (
      [listener] => Event_Subscriber_Calq@vendor_product_created
      [container] => Illuminate\Foundation\Application Object
...

そのリスナーの値にアクセスするにはどうすればよいですか? ->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);

これは恐ろしいことです。これを行う別の方法はありますか?多分反射を使用していますか?

4

2 に答える 2