2012-11-16 2 views
0

이 질문을 정의했다 (런타임)에 PHP 파일을 찾기는 Finding the PHP File (at run time) where a Class was Defined객체의 메서드가

나는 개체 정의 된 파일을 찾을 수 있습니다 유사하다 나는 방법을 찾아야한다 : $ object-> method()는 /var/www/html/object.php 줄에 정의되어있다.

+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 객체입니다. 그래서 위의 해결책은 imho만의 유일한 방법입니다.

+0

코드 생성을 위해 작동하지 마십시오 (예 : eval) –

+0

첫 번째 질문에 생성 된 코드에 대한 언급이 없습니다. 두 번째, 코드가 생성되면 예 : 실제 파일이 아니라 어디서 번호를 가져 오시겠습니까? – aorcsik

+0

예를 들어'__call()'매직 메소드의 경우가 있습니다. 메소드의 실제 선언은 없지만, 모든 것은 실제 메소드를 찾는 것입니다. – aorcsik

관련 문제