重建/获取php函数的代码

Mar*_*era 59 php reflection

我可以通过它的名称以编程方式获取函数代码吗?

喜欢:

function blah($a, $b) { return $a*$b; }
echo getFunctionCode("blah");
Run Code Online (Sandbox Code Playgroud)

可能吗?

是否有任何php自我描述函数来重建函数/类代码?
(意思是代替从源文件获取源代码)

在Java中存在:http://java.sun.com/developer/technicalArticles/ALT/Reflection/

在PHP中:
get_class_methods()
typeof
ReflectionFunction(感谢Alin Purcaru)

Bra*_*ley 77

扩展使用ReflectionFunction的建议,你可以使用这样的东西:

$func = new ReflectionFunction('myfunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine() - 1; // it's actually - 1, otherwise you wont get the function() block
$end_line = $func->getEndLine();
$length = $end_line - $start_line;

$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
print_r($body);
Run Code Online (Sandbox Code Playgroud)

  • 呃......那不是"扩张".这是"实施". (7认同)
  • 是的,我想指出有专门返回文件名和源代码行的函数(即:不解析),但提到“扩展”,因为您已经指向反射类。正如您所指出的,API 的文档很差,因此代码有助于实现这一点。 (2认同)

Ali*_*aru 17

没有任何东西可以提供函数的实际代码.唯一接近可用的是ReflectionFunction类.对于类,您有ReflectionClass,它为您提供类成员(常量,变量和方法)及其可见性,但仍然没有实际代码.


解决方法(确实涉及读取源文件):
使用ReflectionFunction :: export查找声明函数的文件名和行间隔,然后在这些行上读取该文件中的内容.使用字符串处理来获取第一个{和最后一个之间的内容}.

注意:Reflection API文档很少.

  • 注意:此方法自 PHP 7.4 起已弃用:https://www.php.net/manual/en/reflectionfunction.export.php (2认同)

ZiT*_*TAL 7

我们通过不同的操作系统进行编程,gnu/linux、windows、mac...因此,我们在代码中有不同的回车,为了解决这个问题,我分叉了 Brandon Horsley 的答案并准备检查不同的 CR 并从中获取代码类的方法而不是函数:

$cn = 'class_example';
$method = 'method_example';

$func = new ReflectionMethod($cn, $method);

$f = $func->getFileName();
$start_line = $func->getStartLine() - 1;
$end_line = $func->getEndLine();
$length = $end_line - $start_line;

$source = file($f);
$source = implode('', array_slice($source, 0, count($source)));
// $source = preg_split("/(\n|\r\n|\r)/", $source);
$source = preg_split("/".PHP_EOL."/", $source);

$body = '';
for($i=$start_line; $i<$end_line; $i++)
    $body.="{$source[$i]}\n";

echo $body;
Run Code Online (Sandbox Code Playgroud)

  • PHP_EOL 不会这样做吗? (2认同)
  • 只需使用 file_get_contents() 而不是 file() 即可删除 ```$source = implode('', array_slice($source, 0, count($source)));``` 这一行。 (2认同)