2011-04-11 37 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,但我從來沒有使用過,所以我不知道。