У меня есть функция, которая передается 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);
Что ужасно. Есть ли другой способ сделать это? Может быть, с помощью отражения?