我有一个正在传递Closure的函数。我想找出闭包派生的方法的名称。当我调用print_r时,它会输出:
Closure Object
(
[static] => Array
(
[listener] => Event_Subscriber_Calq@vendor_product_created
[container] => Illuminate\Foundation\Application Object
...
我如何获得听众的价值?我试过 - >静态,:: $ 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);
哪个太可怕了。还有另一种方法吗?也许使用反射?
答案 0 :(得分:2)
我知道这篇文章很老,但万一有人在寻找信息, 你需要使用ReflectionFunction:
$ r = new ReflectionFunction($ closure); var_dump($ r,$ r-> getStaticVariables(),$ r-> getParameters());
此致 亚历
答案 1 :(得分:0)
在最近的一个项目中,我决定采用一种使用包装类的声明式方法。该类允许设置描述回调源的自由格式字符串,并且可以用作闭包的直接替代品,因为它实现了 __invoke()
方法。
示例:
use ClosureTools;
$closure = new NamedClosure(
function() {
// do something
},
'Descriptive text of the closure'
);
// Call the closure
$closure();
访问关闭信息:
if($closure instanceof NamedClosure) {
$origin = $closure->getOrigin();
}
由于原点是一个自由格式的字符串,因此可以根据用例将其设置为对识别闭包有用的任何内容。
这里是类骨架:
<?php
declare(strict_types=1);
namespace ClosureTools;
use Closure;
class NamedClosure
{
/**
* @var Closure
*/
private $closure;
/**
* @var string
*/
private $origin;
/**
* @param Closure $closure
* @param string $origin
*/
public function __construct(Closure $closure, string $origin)
{
$this->closure = $closure;
$this->origin = $origin;
}
/**
* @return string
*/
public function getOrigin() : string
{
return $this->origin;
}
public function __invoke()
{
return call_user_func($this->closure, func_get_args());
}
}