我的第一個猜測是閱讀PHP文件並找到行的地方聲明是使用一些正則表達式:
function getLineWhereMethodIsDefined($object, $method_name) {
$class_name = get_class($object);
$reflector = new ReflectionClass($class_name);
$file_name = $reflector->getFileName();
foreach (file($file_name) as $i => $line) {
if (preg_match("'function\s+ " . $method_name . "\('s")) {
$text = $class_name."::".$method_name."()";
$text .= " is defined in ".$file_name." on line ".($i + 1);
return $text;
}
}
return false;
}
由於file()
將整個文件讀入內存,因此在內存使用中這可能會得到改進,因此如果您要解析大文件,那麼使用while(false !== gets()) { }
會更有效。
注:按照ReflectionClass文檔,可以獲取有關的一類方法的唯一信息是ReflectionMethod對象,其中沒有關於在方法聲明信息。所以上述解決方案看起來是唯一的方法。
如果沒有「真正」的答案轉了,你總是可以讀取使用答案的鏈接的問題源文件,並使用正則表達式來查找函數定義。 – grossvogel