使用Reflection从数组元素中检索DocComment?

时间:2011-04-11 14:07:14

标签: php reflection

给出这样的数组:

array(
     /** I'm foo! */
     'foo' => 1,

     /** I'm bar! */
     'bar' => 2,
);

是否可以检索数组元素的DocComments?据我所知,Reflection API没有为此提供机制。如果有可能,我猜它必须是一个非常“有创意”的解决方案。

1 个答案:

答案 0 :(得分:1)

Reflection API本身无法做到这一点(如果它不是一个类,则根本不能这样做)。例如,使用以下代码:

<?php

$bar = array(
     /** I'm foo! */
     'foo' => 1,

     /** I'm bar! */
     'bar' => 2,
);

Reflection API在这里没用(没有类,没有函数)。您仍然可以使用tokenizer

获取它
$code = file_get_contents('input.php');

$tokens = token_get_all($code);
foreach ($tokens as $key => $token) {
    if (is_array($token)) {
        if ($token[0] == T_DOC_COMMENT) {
            for ($i=$key+1; $i<count($tokens); $i++) {
                if (is_array($tokens[$i]) && $tokens[$i][0] != T_WHITESPACE) {
                     echo $tokens[$i][2] . ' = '.$token[1].PHP_EOL;
                     break;
                }
            }
        } /* T_DOC_COMMENT */
    }
}

这将打印:

'foo' = /** I'm foo! */
'bar' = /** I'm bar! */

然而,请记住,这是在一个非常小的例子上完成的。如果你想要解析一个完整的PHP文件(包括类,函数等),你将进入 颠簸

总之,它是可能的,但它涉及大量工作并且非常容易出错。我不推荐它。有might be an actual PHP parser that exists,但我从来没用过,所以我说不出来。