我正在遍历目录中的所有文件。现在我想获得每个函数和类中定义的所有函数和类。从那里,我可以使用ReflectionClass进一步检查它们。我无法弄清楚如何获取文件中定义的所有函数和类。
ReflectionExtension看起来最接近我想要的,除了我的文件不属于扩展名。是否有一些我忽略的课程或功能?
答案 0 :(得分:2)
好问题。 get_declared_classes
和get_defined_functions
可能是一个很好的起点。在尝试确定给定文件中的内容时,您必须记下已定义的类/函数。
此外,不确定您的最终目标是什么,但PHP Depend或PHP Mess Detector等工具可能会执行与您想要的相似的操作。我也建议你查看它们。
答案 1 :(得分:0)
这是我能想到的最好的(courtesy):
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;
}
}
}