PHP获取匿名函数的方法体

通过反射,获取匿名函数的方法体,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function closure_code(Closure $c) {
$r = new ReflectionFunction($c);
$lines = file($r->getFileName());
$firstLine = $lines[$r->getStartLine() - 1];
// 根据'function'的位置,获取函数开始的位置
$firstLine = substr($firstLine, strpos($firstLine, "function"));
$body = implode("", array_slice($lines, $r->getStartLine(), $r->getEndLine() - $r->getStartLine()));
$result = $firstLine . $body;

$lastLine = $lines[$r->getEndLine() - 1];
preg_match_all("/^( +)/", $lastLine, $blank);
// 根据最后一行的缩进(如果有),进行简单的格式化
if (isset($blank[0][0])) {
$prefixBlank = $blank[0][0];
$result = str_replace("\n{$prefixBlank}", "\n", $result);
}
return $result;
}

若有匿名函数定义如下:

1
2
3
$closureFunc = function(User $a, User $b = null) use($base) {
return "welcome " . $a->name . " and " . $b->name . " to " . $base;
};

运行:closure_code($closureFunc),得到结果:

1
2
3
function(User $a, User $b = null) use($base) {
return "welcome " . $a->name . " and " . $b->name . " to " . $base;
};

参考文章: