2012-11-16 52 views
0

這個問題類似於Finding the PHP File (at run time) where a Class was Defined查找PHP文件(在運行時),其中一個對象的方法定義

我能找到的地方被定義的對象的文件:

$reflector = new ReflectionClass(get_class($object)); 
echo $reflector->getFileName(); 

但是,我需要找對方法,如:$對象 - >()方法中/var/www/html/object.php線被定義201

+0

如果沒有「真正」的答案轉了,你總是可以讀取使用答案的鏈接的問題源文件,並使用正則表達式來查找函數定義。 – grossvogel

回答

1

我的第一個猜測是閱讀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對象,其中沒有關於在方法聲明信息。所以上述解決方案看起來是唯一的方法。

+0

不要爲生成代碼(例如EVAL) –

+0

1日上班,有沒有關於這個問題生成的代碼提。 第二,如果代碼生成,例如。不是在實際的文件中,你想從哪裏得到行號? – aorcsik

+0

有與'__call()'魔術方法,其中有一種方法沒有實際的聲明,例如案件,但整個事情就是找到實際的方法。 – aorcsik

相關問題