如何检查PHP中的关闭



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());
    }
}

相关内容

  • 没有找到相关文章

最新更新