我可以通过它的名称以编程方式获取函数代码吗?
喜欢:
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)
Ali*_*aru 17
没有任何东西可以提供函数的实际代码.唯一接近可用的是ReflectionFunction类.对于类,您有ReflectionClass,它为您提供类成员(常量,变量和方法)及其可见性,但仍然没有实际代码.
解决方法(确实涉及读取源文件):
使用ReflectionFunction :: export查找声明函数的文件名和行间隔,然后在这些行上读取该文件中的内容.使用字符串处理来获取第一个{和最后一个之间的内容}.
注意:Reflection API文档很少.
我们通过不同的操作系统进行编程,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)