2010-04-19 1 views
3

Мне нужно получить список функций с их содержимым (а не только именем функции) из php-файла. Я пытался использовать регулярное выражение, но у него много ограничений. он не анализирует все типы функций. например, он терпит неудачу, если функция имеет команды if и for loop.Как получить список заявленных функций с их данными из php-файла?

в деталях: У меня около 100 включенных файлов. каждый файл имеет количество объявленных функций. некоторые файлы дублируются в других файлах. поэтому я хочу получить список всех функций из определенного файла, а затем поместить этот список внутри массива, тогда я буду использовать уникальный массив, чтобы удалить дубликаты. Я читал о токенизаторе, но я действительно не знаю, как заставить его захватить объявленную функцию с ее данными. все у меня есть это:

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; 
} 

, к сожалению, эта функция перечисляет только имена функций .. то, что мне нужно, чтобы перечислить заявленную функцию целого с его структурой .. поэтому любые идеи?

заранее спасибо ..

+0

Вы хотите, чтобы тело функции, например, когда вы найдете 'function foo() {return 'foo';}' вы хотите, чтобы он возвращал 'return 'foo;''. Просьба привести пример ожидаемых результатов. А также предоставите более подробную информацию о том, зачем вам это нужно в первую очередь. – Gordon

+0

Я работаю над скриптом под названием «includeer». это используется для анализа файлов php, содержащих инструкции include. поэтому мы читаем путь включений и получаем данные с помощью file_get_contents. и верните их в основной файл. У меня около 100 файлов include. каждый из этих файлов имеет некоторые функции. некоторые из этих функций были повторно объявлены в других файлах. поэтому я хочу, чтобы список всех функций из всех этих файлов содержал эти функции, тогда мне нужно поместить их внутрь массива и, наконец, использовать array_unique для удаления дубликатов. если у вас есть лучшее решение, пожалуйста, просветите меня .. спасибо, – ermac2014

ответ

2

Если вы получили имена функций из вашего get_defined_functions, рассмотреть возможность использования 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, потому что файл, который у меня есть, содержит дублированные функции. поэтому, когда я включаю его в основной скрипт, я получаю дублированные объявленные функциональные ошибки. для второго примера, я всегда получаю эту ошибку: «Фатальная ошибка: Class„Zend_Reflection_File“не найден» Я использую PHP V5.2.6 мне нужно, чтобы добавить расширения, чтобы сделать эту работу? спасибо, – ermac2014

+0

@ ermac2014 'Zend_Reflection' является компонентом http://framework.zend.com/ - вам не нужно расширение для его использования, но вам нужно загрузить фреймворк. – Gordon

+0

, но это код php правильно? Я хочу использовать его с php .. – ermac2014

 Смежные вопросы

  • Нет связанных вопросов^_^