2011-06-11 52 views
1

我最近熟悉Reflection,並且一直在試驗它,特別是getDocComment(),但它似乎只支持/** */註釋塊。PHP反射;提取非塊註釋

/** foobar */ 
class MyClass{} 

$refl = new ReflectionClass('MyClass'); 

// produces /** foobar */ 
echo $refl->getDocComment(); 

-Versus-

# foobar 
class MyClass{} 

$refl = new ReflectionClass('MyClass'); 

// produces nothing 
echo $refl->getDocComment(); 

是沒可能捕捉到了這個不訴諸任何形式file_get_contents(__FILE__)廢話?


dader51的回答,我想我的最好的辦法是沿着這些路線的東西:

// random comment 

#[annotation] 

/** 
* another comment with a # hash 
*/ 

#[another annotation] 

$annotations 
    = array_filter(token_get_all(file_get_contents(__FILE__)), function(&$token){ 
    return (($token[0] == T_COMMENT) && ($token = strstr($token[1], '#'))); 
}); 

print_r($annotations); 

輸出:

Array 
(
    [4] => #[annotation] 

    [8] => #[another annotation] 

) 
+0

關於我的編輯;它仍然不可行。 Microtime對Zend_Controller_Front類文件(* 1007行,3497個令牌*)進行了測試,平均需要「0.010729945898056」(在我的個人開發箱*上有1000次迭代) – Dan 2011-06-11 07:44:27

+0

你是否明白這一點?想知道你是否找到了更好的方法。 – dader 2012-11-03 14:35:11

+0

@dader不,對給定文件的直接文本解析可能會產生更好的性能,但是您需要理解結果。 – Dan 2012-11-13 18:27:53

回答

5

與可幫助開發人員閱讀代碼的常規註釋相比,DocComments通過說出如何使用類來區分自己。這也是爲什麼該方法不被稱爲getComment()的原因。

當然,這是全部的文本解析,有人只是在docComments中做出選擇,始終是這些多行註釋,但顯然已經做出了這種選擇,閱讀常規評論不是反射類別中的某些東西。

+0

謝謝** C.Evenhuis **;那麼,這是不幸的。我很好奇,因爲在閱讀中我聽說了支持它的PHP ** XP Framework **,但在挖掘之後,我瞭解到他們已經實現了自己的反射類,這大概會增加對它的支持。 http://docs.xp-framework.net/xml/doc?core/reflection – Dan 2011-06-11 06:56:30

2

據我所知,對於一個評論成爲文檔需要以/ **開頭,甚至沒有標準的多行註釋。

2

正如你可以讀出第一用戶投稿注意here

的文檔註釋(T_DOC_COMMENT)必須​​開始/ ** - 這是兩個星號,沒有之一。評論一直持續到第一個/。正常的多行註釋/ ... * /(T_COMMENT)不算作文檔評論。

所以只有/ ** * /塊是由這種方法給出的。

我不知道任何其他方法與PHP獲得其他評論,因爲使用file_get_contents和篩選評論與例如。 a regex

+0

謝謝** Wessel Kranenborg **;該死。我在其他地方看到過這種情況,我只是不知道是否對非文檔塊評論提供了支持。因爲'getDocComment'出現三次,PHP應該在註釋涉及擴展方法時整合類方法上的用戶註釋。我明白這是上下文,但仍然是。 – Dan 2011-06-11 06:59:12

2

顧名思義,doc評論是文檔評論,而不是標準評論,否則當您爲諸如doxygen之類的應用抓取評論時,它會嘗試記錄來自testing/debuggung等的任何評論代碼,被拋在身後,對API的用戶來說並不重要。

4

前幾天我試圖做一個你,這裏是我的竅門。你可以只使用PHP內部標記生成器(http://www.php.net/manual/en/function.token-get-all.php),然後步行返回數組只選擇意見,這裏是一個示例代碼:

$a = token_get_all(file_get_contents('path/to/your/file.php')); 
print_r($a); // display an array of all tokens found in the file file.php 

這裏是所有標記列表PHP承認:http://www.php.net/manual/en/tokens.php

並且您將通過此方法獲得的評論包括(來自php。網網站):

T_COMMENT://或#,和/ * */PHP 5中

希望它能幫助!

+0

謝謝** dader51 **;這很好,除了它使用凌亂的'file_get_contents(__ FILE __)'方法進行自我反思,並且很難將給定的評論與定義(類,函數等)聯繫起來。 – Dan 2011-06-11 07:20:41

+0

是的,我知道file_get_contents問題,另外使用分詞器爲此目的將帶你到解析領域,這實際上是一個整個國家... – dader 2011-06-12 17:02:30

+0

這只是讓我的一天!謝謝@dader! – 2011-09-15 11:37:34