私の最初の推測は、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オブジェクトだけであり、メソッドが宣言されている場所に関する情報はありません。したがって、上記の解決策が唯一の方法のようです。