2011-04-11 38 views
1

鉴于这样的数组:使用Reflection从数组元素中检索DocComment?

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

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

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

+1

这些不是doccomments,但只是评论。此外,您的示例并未指定遇到这种情况的上下文,例如类,功能或仅仅是文件。 – Gordon 2011-04-11 14:13:36

+0

你为什么要这样做?评论是针对人类的,以这种方式使用它们似乎违反直觉。 – 2011-04-11 14:16:01

+0

@Adam指针:不是。评论可以用于很多事情(请参阅PHPDocumentor和PHPUnit)。而且,在Java中,它们实际上对编译器很有用(例如:@exception标签)。 – netcoder 2011-04-11 14:23:29

回答

1

反射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,但我从来没有使用过,所以我不知道。