2012-03-10 86 views
1

可能重複:
How to find out where a function is defined?哪裏定義了php函數?

我想知道(編程方式,可能是通過反射API)當某PHP函數定義。

+1

你是指什麼意思*哪裏*?你是指在哪個文件或哪個類別或什麼? – Sarfraz 2012-03-10 09:51:00

+0

@Sarfraz我正在尋找文件:行,但你如何給一個方法的名稱,並找出有這種方法的類? – 2012-03-10 09:59:53

+0

@ ashy_32bit:請用所需信息更新問題。一般而言,通過更新您的帖子來回應澄清請求,而不是回覆評論。首先,如果沒有閱讀評論,一個問題應該是可以理解的。另一方面,SO是一個質量保證和網站,而不是一個論壇,評論意圖不適合(也不適合)討論。 – outis 2012-03-10 15:17:02

回答

5

看起來相關的ReflectionFunction類有東西(getFileName,getStartLine等)。

(未測試)

1

debug_backtrace()會給背面與正在發出的所有呼叫的陣列,並且還的功能/方法的定義。反射類將爲您提供該函數的定義。

例如我用這個舊項目內登錄deprectated功能:

function logDeprecated() { 
    $trail = debug_backtrace(); 
    if ($trail[1]['type']) { 
     $function = new ReflectionMethod($trail[1]['class'], $trail[1]['function']); 
    } else { 
     $function = new ReflectionFunction($trail[1]['function']); 
    } 
    $errorMsg = 'Function ' . $trail[1]['function']; 
    if ($trail[1]['class']) { 
     $errorMsg .= ' of class ' . $trail[1]['class']; 
    } 
    $errorMsg .= ' is deprecated (called from ' . $trail[1]['file'] . '#' . $trail[1]['line'] . ', defined in ' . $function->getFileName() . '#' . $function->getStartLine() . ')'; 
     return $errorMsg; 
} 
+0

也許我沒有把它弄好,但是它實際上告訴你任何關於trace元素被定義的位置而不是被調用的地方嗎? – 2012-03-10 09:57:39

+0

@ ashy_32bit:你說得對,它並沒有真正顯示它的定義。我已經添加了一個示例,說明如何使用反射記錄不推薦使用的函數 – konsolenfreddy 2012-03-10 10:03:34

1
ReflectionMethod::getStartLine() 
ReflectionMethod::getFileName() 
ReflectionFunction::getStartLine() 
ReflectionFunction::getFileName() 
0

也許它不是最好的解決辦法,但如果你不會找到點兒什麼,你可以找到使用grep命令,如果你使用的是Linux的功能定位。

exec('grep -irn "yourFunctionName" ./library', $response); 
foreach ($response as $file) { 
    list($filename, $line) = explode(":", $file); 
}