加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

查看PHP Closure的源代码

发布时间:2020-12-13 18:05:40 所属栏目:PHP教程 来源:网络整理
导读:是否有可能反映或以其他方式查看 PHP闭包对象的来源?也就是说,如果我做这样的事情 $closure = function(){ return 'Hi There';}; 然后这样的事情 var_dump($closure); PHP输出 object(Closure)[14] 也就是说,我知道对象是一个闭包,但我不知道它的作用. 我正
是否有可能反映或以其他方式查看 PHP闭包对象的来源?也就是说,如果我做这样的事情
$closure = function()
{
    return 'Hi There';
};

然后这样的事情

var_dump($closure);

PHP输出

object(Closure)[14]

也就是说,我知道对象是一个闭包,但我不知道它的作用.

我正在寻找一个反射方法,函数或调试扩展,它允许我转储匿名函数的实际主体.

您可以从PHP获得的是有限的,使用反射您只需获取函数的参数签名以及源代码文件的开始和结束行.我曾经写过一篇博客文章: http://www.metashock.de/2013/05/dump-source-code-of-closure-in-php/ ……

它引导我使用反射以下代码:

function closure_dump(Closure $c) {
    $str = 'function (';
    $r = new ReflectionFunction($c);
    $params = array();
    foreach($r->getParameters() as $p) {
        $s = '';
        if($p->isArray()) {
            $s .= 'array ';
        } else if($p->getClass()) {
            $s .= $p->getClass()->name . ' ';
        }
        if($p->isPassedByReference()){
            $s .= '&';
        }
        $s .= '$' . $p->name;
        if($p->isOptional()) {
            $s .= ' = ' . var_export($p->getDefaultValue(),TRUE);
        }
        $params []= $s;
    }
    $str .= implode(',',$params);
    $str .= '){' . PHP_EOL;
    $lines = file($r->getFileName());
    for($l = $r->getStartLine(); $l < $r->getEndLine(); $l++) {
        $str .= $lines[$l];
    }
    return $str;
}

如果你有以下关闭:

$f = function (Closure $a,&$b = -1,array $c = array())
  use ($foo) 
{
    echo $this->name;
    echo 'test';
};

closure_dump()将给出以下结果:

function (Closure $a,array $c = array (
)){
 use ($foo)
{
    echo $this->name;
    echo 'test';
};

你看它不完美(数组参数).它也不会正确处理一些边缘情况,特别是如果闭包是嵌套的,或者多个内联闭包将传递给一行中的函数.后者对我来说看起来最成问题.因为,你只得到反射的起始行和结束行,在这种情况下,这两个函数都将在那一行上,你没有任何有用的信息来决定应该转储哪一行.到目前为止,我没有找到解决方案,我也不确定是否有解决方案.

但是,在大多数情况下,只要您不依赖它,它至少应该对调试有帮助. Feel free to enhance it!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读