是否有可能反映或以其他方式查看PHP闭包对象的来源?也就是说,如果我做这样的事情
$closure = function()
{
return 'Hi There';
};
Run Code Online (Sandbox Code Playgroud)
然后这样的事情
var_dump($closure);
Run Code Online (Sandbox Code Playgroud)
PHP输出
object(Closure)[14]
Run Code Online (Sandbox Code Playgroud)
也就是说,我知道对象是一个闭包,但我不知道它是做什么的.
我正在寻找一个反射方法,函数或调试扩展,它将允许我转储匿名函数的实际主体.
hek*_*mgl 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;
}
Run Code Online (Sandbox Code Playgroud)
如果你有以下关闭:
$f = function (Closure $a, &$b = -1, array $c = array())
use ($foo)
{
echo $this->name;
echo 'test';
};
Run Code Online (Sandbox Code Playgroud)
closure_dump() 将给出以下结果:
function (Closure $a, &$b = -1, array $c = array (
)){
use ($foo)
{
echo $this->name;
echo 'test';
};
Run Code Online (Sandbox Code Playgroud)
你看它不完美(数组参数).此外,它不会正确处理某些边缘情况,特别是如果闭包是嵌套的,或者多个内联闭包将传递给一行中的函数.后者对我来说看起来最成问题.因为,你只得到反射的起始和结束行,在这种情况下,这两个函数都将在那一行上,你没有任何有用的信息来决定应该转储哪一个.到目前为止,我没有找到解决方案,我也不确定是否有解决方案.
但是,在大多数情况下,只要您不依赖它,它至少应该对调试有帮助.随意加强它!