2011-08-11 91 views
44

我可以通過它的名稱以編程方式獲取函數代碼嗎?重建/獲取php函數的代碼

像:

function blah($a, $b) { return $a*$b; } 
echo getFunctionCode("blah"); 

這可能嗎?

是否有任何PHP自我描述函數來重建函數/類代碼?
(平均而不是獲取源代碼,直接從源文件)

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

在PHP:
get_class_method(0函數)
的typeof
ReflectionFunction(感謝阿林Purcaru)

+3

爲什麼這些downvotes? –

+2

不太確定爲什麼這個問題被低估了。實際上,我發現它很有趣。 –

+1

@Marek,Martin可能是因爲**非常粗魯的評論馬立克留給儒勒天真的答案。 –

回答

61

上使用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); 
+4

呃...這不是「擴大」。這是「實施」。 –

+1

對,我想指出的是,有函數專門返回文件名和源代碼行(即:不解析),但提到了「擴展」,因爲您已經指向了反射類。正如你所指出的那樣,這個API的文檔記錄很差,所以代碼方便了這一點。 –

+0

@MarekSebera它不是關於誰的第一個,它關於你使用哪個答案,記錄 – Ascherer

17

沒有任何東西會給你實際的功能代碼。接近可用的唯一東西是ReflectionFunction類。對於有ReflectionClass的類,它爲您提供了類成員(常量,變量和方法)及其可見性,但仍然沒有實際的代碼。


解決方法(它不涉及讀取源文件):
使用ReflectionFunction::export找出函數聲明的文件名和行間距,然後讀取這些行該文件的內容。使用字符串處理獲取第一個{和最後一個}之間的內容。

注意:Reflection API記錄不完整。

+0

很好的解決方法,我會給它一點時間讓其他用戶採取一部分,然後檢查您的答案接受 –