Получить функции и классы, определенные в файле? - PullRequest
4 голосов
/ 04 октября 2011

Я перебираю все файлы в каталоге. Теперь я хочу получить все функции и классы, определенные в каждой из них. Оттуда я могу изучить их далее, используя ReflectionClass . Хотя я не могу понять, как получить все функции и классы, определенные в файле.

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

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Отличный вопрос.get_declared_classes и get_defined_functions могут быть хорошей отправной точкой.Вам нужно будет принять к сведению, какие классы / функции уже определены, при попытке определить, что находится в данном файле.

Кроме того, не уверены, какова ваша конечная цель, но такие инструменты, как PHP Зависит или PHP Mess Detector может сделать что-то похожее на то, что вы хотите.Я бы порекомендовал также проверить их.

0 голосов
/ 04 октября 2011

Это лучшее, что я мог придумать ( вежливость ):

function trimds($s) {
    return rtrim($s,DIRECTORY_SEPARATOR);
}

function joinpaths() {
    return implode(DIRECTORY_SEPARATOR, array_map('trimds', func_get_args()));
}

$project_dir = '/path/to/project/';

$ds = array($project_dir);

$classes = array();

while(!empty($ds)) {
    $dir = array_pop($ds);
    if(($dh=opendir($dir))!==false) {
        while(($file=readdir($dh))!==false) {
            if($file[0]==='.') continue;
            $path = joinpaths($dir,$file);
            if(is_dir($path)) {
                $ds[] = $path;
            } else {
                $contents = file_get_contents($path);
                $tokens = token_get_all($contents);
                for($i=0; $i<count($tokens); ++$i) {
                    if(is_array($tokens[$i]) && $tokens[$i][0] === T_CLASS) {
                        $i += 2;
                        $classes[] = $tokens[$i][1];
                    }
                }
            }
        }
    } else {
        echo "ERROR: Could not open directory '$dir'\n";
    }
}

print_r($classes);

Жаль, что мне не нужно было анализировать файлы и перебирать все токены, как это.


Забытые прежние решения мешают мне использовать отражение так, как я хотел. Новое решение:

$project_dir = '/path/to/project/';

$ds = array($project_dir);

while(!empty($ds)) {
    $dir = array_pop($ds);
    if(($dh=opendir($dir))!==false) {
        while(($file=readdir($dh))!==false) {
            if($file[0]==='.') continue;
            $path = joinpaths($dir,$file);
            if(is_dir($path)) {
                $ds[] = $path;
            } else {
                try{
                    include_once $path;
                }catch(Exception $e) {
                    echo 'EXCEPTION: '.$e->getMessage().PHP_EOL;
                }
            }
        }
    } else {
        echo "ERROR: Could not open directory '$dir'\n";
    }
}

foreach(get_declared_classes() as $c) {
    $class = new ReflectionClass($c);
    $methods = $class->getMethods();
    foreach($methods as $m) {
        $dc = $m->getDocComment();
        if($dc !== false) {
            echo $class->getName().'::'.$m->getName().PHP_EOL;
            echo $dc.PHP_EOL;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...