i具有通过闭合的函数。我想找出封闭的方法的名称。当我调用print_r时,它会输出以下内容:
Closure Object
(
[static] => Array
(
[listener] => Event_Subscriber_Calq@vendor_product_created
[container] => IlluminateFoundationApplication 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);
这太可怕了。还有另一种方法吗?也许使用反射?
我知道这篇文章是旧的,但是如果有人在寻找信息,您需要使用反射功能:
$r = new ReflectionFunction($closure);
var_dump($r, $r->getStaticVariables(), $r->getParameters());
问候,Alex
在最近的一个项目中,我决定使用包装器类决定一种声明的方法。该类允许设置一个描述回调的源的自由形式字符串,并且可以用作闭合的直接替换,因为它实现了__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());
}
}