【问题标题】:List All Classes And Methods In A Script File列出脚本文件中的所有类和方法
【发布时间】:2013-02-16 17:45:32
【问题描述】:

我想在选择特定脚本文件后将所有类及其方法名称以及方法类型(公共、私有、受保护)输出到数组中。

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

例如在脚本文件 test.php 中说它有以下内容:

class test{

public function dostuff(){

}

private function hide(){

}
}

它应该给我一个这样的列表: 类别:测试 方法: 东西(公共) 隐藏(私人)

【问题讨论】:

  • 我看到的唯一方法是使用正则表达式..
  • 你可以使用get_class_methods它会在数组中输出XYZ类的所有公共方法。
  • 是的,但这需要我先知道班级的名称。我想要一种方法来“检测”类,而无需先从文件中知道它们的名称。
  • 您可以分配给用户,例如,整数级别。将其存储在数据库中,在用户登录时获取。然后您可以检查级别并显示允许的内容:输入、按钮。比如 if ($user->level >= GUEST_LEVEL) echo "You have a permission to do so and so" ;当然,除了图形的东西,你还必须检查你的逻辑引擎中的水平。
  • 有趣的想法 atm 我只有查看和写入设置(即允许他们添加/修改数据库内容)

标签: php


【解决方案1】:

好的,这就是我的建议:

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

【讨论】:

  • 看起来很有希望。这是一个更好的方法然后使用我在这里看到的令牌方式php.net/token_get_allstackoverflow.com/questions/928928/…
  • @Nuvolari 好吧,这在很大程度上取决于你想用它做什么。我个人更喜欢这个版本(因为它更短更简单),但作为一个缺点,请记住,每次我们想要分析脚本时都会出现完整的include
  • 我会同时分析 10 到 1000 多个脚本文件,并将它们的类/方法输入到数据库中。
  • @Nuvolari 好吧,如果这是一次性的事情(即使 1000 多个脚本相当多),我仍然会坚持这种方法。如果它应该在某些服务器上不断运行,那么我会选择其他东西。只是我的 0.2 美分...
  • 它更多的是一次或偶尔的事情。
【解决方案2】:
<?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 />";
}

?>

【讨论】:

  • 此代码有效,但不考虑函数名和大括号之间的空格。例如:public function test() { 可以,但public function test() [new line] {' will not.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多