Как получить список объявленных функций с их данными из php файла? - PullRequest
3 голосов
/ 19 апреля 2010

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

в деталях: У меня есть около 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;
}

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

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

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Если вы получили имена функций из вашего 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 предложил , вы также можете использовать 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();
}
1 голос
/ 19 апреля 2010

Попробуйте Zend_Reflection http://framework.zend.com/manual/en/zend.reflection.html

...