2010-04-19 1 views
3

php 파일의 내용 (함수 이름뿐만 아니라)과 함께 함수 목록을 가져와야합니다. 정규 표현식을 사용하려고했지만 많은 제약이 있습니다. 모든 유형의 함수를 구문 분석하지는 않습니다. 예를 들어 함수에 if 및 for 루프 문이 있으면 실패합니다.php 파일의 데이터로 선언 된 함수 목록을 가져 오는 방법은 무엇입니까?

세부 사항 : 약 100 개의 파일이 있습니다. 각 파일에는 선언 된 함수의 수가 있습니다. 일부 파일에는 다른 파일에 복제 된 기능이 있습니다. 그래서 내가 원하는 것은 특정 파일로부터 모든 함수의 목록을 얻은 다음이 목록을 배열 안에 넣고 중복을 제거하기 위해 배열을 고유하게 사용할 것입니다. Tokenizer에 대해 읽었지 만 데이터로 선언 된 함수를 가져 오는 방법을 모릅니다. 내가 가진 모든이 있습니다 :

function get_defined_functions_in_file($file) 
{ 
    $source = file_get_contents($file); 
    $tokens = token_get_all($source); 

    $functions = array(); 
    $nextStringIsFunc = false; 
    $inClass = false; 
    $bracesCount = 0; 

    foreach($tokens as $token) { 
     switch($token[0]) { 
      case T_CLASS: 
       $inClass = true; 
       break; 
      case T_FUNCTION: 
       if(!$inClass) $nextStringIsFunc = true; 
       break; 

      case T_STRING: 
       if($nextStringIsFunc) { 
        $nextStringIsFunc = false; 
        $functions[] = $token[1]; 
       } 
       break; 

      // Anonymous functions 
      case '(': 
      case ';': 
       $nextStringIsFunc = false; 
       break; 

      // Exclude Classes 
      case '{': 
       if($inClass) $bracesCount++; 
       break; 

      case '}': 
       if($inClass) { 
        $bracesCount--; 
        if($bracesCount === 0) $inClass = false; 
       } 
       break; 
     } 
    } 

    return $functions; 
} 

불행하게도,이 기능 만 나열 함수 이름 .. 내가 필요한 이 구조 전체에 선언 된 기능 .. 그래서 어떤 아이디어를 나열하는 것입니다? 당신이 당신의 get_defined_functions에서 함수 이름을 가지고있는 경우 사전에

덕분에 ..

+0

당신이 함수 본문을 원하십니까, 예를 들어, 당신이'function foo() {return 'foo';}'를 발견했을 때'return 'foo;''를 반환하기를 원할 것입니다. 예상되는 결과의 예를 들어주십시오. 그리고 왜 처음부터 그렇게해야하는지에 대한 자세한 내용을 제공하십시오. – Gordon

+0

"includer"라는 스크립트를 작성 중입니다. 이것은 PHP 파일을 구문 분석하는 데 사용되는 "포함"문을 포함합니다. 그래서 우리는 포함 된 경로를 읽고 file_get_contents를 사용하여 데이터를 얻습니다. 다시 주 파일로 옮깁니다. 약 100 개의 파일이 있습니다. 이 파일들 각각에는 몇 가지 기능이 있습니다. 일부 함수는 다른 파일에서 다시 선언되었습니다. 그래서 내가 원하는 것은이 모든 파일에서 모든 함수 목록을 얻는 것입니다. 그리고 나서이 함수들을 포함하고 있습니다. 그런 다음 배열 안에 넣고 마지막으로 array_unique를 사용하여 중복을 제거해야합니다. 당신이 더 나은 해결책을 가지고 계신다면 저에게 계발하십시오. 고마워, – ermac2014

답변

2

, 나머지 작업 Reflection API을 사용하는 것이 좋습니다.

예 : 파일 및 그 내용의 기능 :

include 'file-with-functions.php'; 
$reflector = new ReflectionFunction('foo'); // foo() being a valid function 
$body = array_slice(
    file($reflector->getFileName()), // read in the file containing foo() 
    $reflector->getStartLine(), // start to extract where foo() begins 
    $reflector->getEndLine() - $reflector->getStartLine()); // offset 

echo implode($body); 

@nunthrey suggested처럼, 당신은 또한 모두를 얻을 수 Zend_Reflection를 사용할 수 있습니다. Zend_Reflection와 예 :

$reflector = new Zend_Reflection_File('file-with-functions.php'); 
foreach($reflector->getFunctions() as $fn) { 
    $function = new Zend_Reflection_Function($fn->name); 
    echo $function->getContents(); 
} 
+0

안녕하세요, 답장 정말 고마워요 .. 첫 번째 예제를 추가했습니다. 내가 가지고있는 파일에 중복 된 기능이 포함되어 있으므로 include를 사용할 수 없습니다. 그래서 그것을 주 스크립트에 포함 시키면 선언 된 함수 오류가 중복됩니다. : 두 번째 예를 들어 , 난 항상이 오류 얻을 "치명적인 오류 : 클래스 'Zend_Reflection_File'을 (를) 찾을 수 없습니다"를 내가 PHP는 v5.2.6 을 사용하고 내가이 일을하기 위해 확장을 추가해야합니까? 감사합니다, – ermac2014

+0

@ ermac2014'Zend_Reflection'은 http://framework.zend.com/의 구성 요소입니다.이 구성 요소를 사용하려면 확장 기능이 필요 없지만 프레임 워크를 다운로드해야합니다. – Gordon

+0

하지만 이것은 PHP 코드 맞습니까? 나는 그것을 PHP와 함께 사용하고 싶다. – ermac2014

관련 문제