2013-02-16 77 views
1

我想在选择特定脚本文件后将所有类及其方法名称以及方法类型(public,private,protected)输出到数组。列出脚本文件中的所有类和方法

这将用于创建权限系统,其中管理员可以指定特定用户组可以访问哪些类。

举例说,在脚本文件test.php的有以下几点:

class test{ 

public function dostuff(){ 

} 

private function hide(){ 

} 
} 

应该给我一个这样的名单: 类:测试 方法: dostuff(公共) 隐藏(私人)

+0

只有我看到这样做是用正则表达式来玩.. – Gntem 2013-02-16 07:59:02

+0

你可以使用'get_class_methods'它会输出数组中所有类XYZ的公共方法。 – 2013-02-16 08:08:51

+0

是的,但这需要我首先知道班级的名字。我想要一种方法来“检测”类,而不必先从文件中知道它们的名称。 – Nuvolari 2013-02-16 08:15:16

回答

3

OK,这就是我建议:

// Get new class name 

$classes = get_declared_classes(); 
include 'your_php_file.php'; 
$diff = array_diff(get_declared_classes(), $classes); 
$class = reset($diff); 

// Get class's methods 

$methods = get_class_methods($class); 

// Print them out 

echo "Class : ".$class; 
foreach ($methods as $method) { 
    echo "$method\n"; 
} 
+0

看起来很有希望。这是一个更好的方法,然后使用令牌的方式http://php.net/token_get_all,我在这里看到:http://stackoverflow.com/questions/928928/determining-what-c​​lasses-are-defined-in-a- php-class-file – Nuvolari 2013-02-16 08:49:28

+1

@Nuvolari嗯,这很大程度上取决于你想用它做什么。但是我个人更喜欢这个版本(因为它更简短得多),作为一个con - 请记住,每当我们想要分析一个脚本时都会发生一个完整的'include'。 – 2013-02-16 09:34:29

+0

好吧,我会一次分析10到1000个脚本文件之间的任何地方,并将它们的类/方法输入到数据库中。 – Nuvolari 2013-02-16 09:39:07

1
<?php 
$file="test_class.php"; 
$fp = fopen($file, 'r'); 
$class = $buffer = ''; 
$method = $buffer = ''; 
while(!feof($fp)) 
{ 
    $buffer .= fread($fp, 512); 
    if (preg_match('/class\s+(\w+)(.*)?\{/', $buffer, $matches)) { 
     $class = $matches[1]; 
     //break; 
    } 
    if (preg_match_all('/function\s+(\w+)(.*)?\{/', $buffer, $match)) { 
     $method = $match[1]; 
     //print_r($match); 
     //break; 
    } 
} 


echo "class:".$class."<br />"; 
//print_r($method); 
foreach($method as $key=>$val) 
{ 
echo "method : ".$val."<br />"; 
} 

?> 
+0

此代码有效,但不包括函数名称和大括号之间的空格。例如:'公共功能测试(){'将工作,但'公共功能测试()[新行] {'不会.' – Simeon 2015-03-31 22:54:02

相关问题