【问题标题】:How to get list of declared functions with their data from php file?如何从 php 文件中获取已声明函数及其数据的列表?
【发布时间】:2010-04-19 10:19:17
【问题描述】:

我需要从 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;
}

不幸的是,这个函数只列出了函数名.. 我需要的是列出整个声明的函数及其结构.. 有什么想法吗?

提前谢谢..

【问题讨论】:

  • 你想要函数体吗,例如当您找到function foo() {return 'foo';} 时,您希望它返回return 'foo;'。请举例说明预期结果。并提供更多详细信息,说明您首先需要它的原因。
  • 我正在编写名为“includer”的脚本。这用于解析包含“include”语句的 php 文件。所以我们读取包含的路径并使用 file_get_contents 获取数据。并将它们放回主文件。我有大约 100 个包含文件。这些文件中的每一个都有一些功能。其中一些功能已在其他文件中重新声明。所以我想要的是从所有这些文件中获取所有函数的列表,其中包含这些函数,然后我需要将它们放在数组中,最后使用 array_unique 删除重复项。如果您有更好的解决方案,请赐教..谢谢,

标签: php list function get declare


【解决方案1】:

如果您从 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 suggested 一样,您也可以使用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();
}

【讨论】:

  • 嗨,感谢您的回复,非常感谢您添加的第一个示例。我不能使用包含,因为我拥有的文件包含重复的函数。所以当我将它包含到主脚本中时,我会得到重复的声明函数错误。对于第二个例子,我总是得到这个错误:“致命错误:找不到类'Zend_Reflection_File'”我正在使用 php v5.2.6 我需要添加扩展才能使其工作吗?谢谢,
  • @ermac2014 Zend_Reflectionframework.zend.com 的一个组件——你不需要扩展来使用它,但你需要下载框架。
  • @ermac2014 应该是对的,是的。为什么?是不是你试过了还是不行?
  • 不起作用我之前告诉过你...我收到这个错误:“致命错误:找不到类'Zend_Reflection_File'”我需要一个扩展来使它工作。我不知道是哪个
  • 您不需要扩展。您所要做的就是下载 Zend Framework。您给出的错误听起来更像是 PHP 找不到该类的路径,该路径位于 Zend/Reflection/File.php 中。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    相关资源
    最近更新 更多