2010-03-27 82 views
14

我想爲少數項目構建一些規模較小但高度自定義的文檔網站。 PhpDocumentor非常棒,但它非常重。我考慮過爲此調整模板,但花費了幾分鐘的時間纔看到它,我認爲這將是太多的工作。是否有任何PHP DocBlock解析器工具可用?

理想情況下,我希望看到一些我可以傳遞一堆文件並讓它返回所有文件,類,屬性和方法以及他們的元數據的東西,這樣我就可以構建出一些簡單的基於數據的模板。

是否有任何DocBlock解析器項目可以幫助我完成這項任務,還是我堅持重新發明那個輪子?

回答

20

您可以用Reflection API:

/** 
* This is an Example class 
*/ 
class Example 
{ 
    /** 
    * This is an example function 
    */ 
    public function fn() 
    { 
     // void 
    } 
} 

$reflector = new ReflectionClass('Example'); 

// to get the Class DocBlock 
echo $reflector->getDocComment() 

// to get the Method DocBlock 
$reflector->getMethod('fn')->getDocComment(); 

做到這一點很容易看到自己本教程:http://www.phpriot.com/articles/reflection-api

還有一個PEAR package可以解析文檔塊。

+0

要使用反射,難道你不需要加載包含感興趣的類的PHP腳本?你如何做到這一點,爲一個任意長的PHP腳本列表? – 2010-04-03 15:32:34

+0

@Ira請參閱http://php.net/manual/en/reflectionclass.getdoccomment.php上的示例 - 如果您想解析類的文件,可以使用http://github.com/theseer/Autoload/blob /master/src/classfinder.php並遍歷你可以使用的目錄http://php.net/manual/en/class.recursivedireiteiterator.php – Gordon 2010-04-03 16:00:29

-2

您似乎想要一個可以導出已解析內容的特定細節的PHP解析器。

我們的Semantic Designs PHP Front End提供了完整的PHP 4/5解析器(截至2016年包括PHP 7)。它解析PHP源代碼,構建抽象語法樹,用精確的位置信息標記每個節點,並使其可供進一步使用。它可以做的一件事是將任何子樹打印回原始文本。

就你而言,你需要掃描樹,找到類/方法/屬性(作爲樹節點)並打印它們的源文本以及位置信息。我認爲這將提供你想要的。

+2

Ira Baxter,這就像我遇到的商業產品的第五個廣告同時試圖解決與PHP DocBlocks相關的問題。 在這些廣告中,您沒有明確說明文字上與廣告產品供應商的關係。 – 2015-09-02 11:07:19

+0

你稱他們爲「廣告」,以表示對商業問題解決方案的反對。這爲OP建議的問題提供了一個解決方案,這使得這是一個合理的答案。有人反對我的一些反應沒有清楚地表明我的聯繫,這些反對在SO的生命早期偶爾是真實的,儘管我的生物非常明確地表明我*是供應商,而不僅僅是關聯。這是非常早期的迴應之一。 ...... – 2015-09-02 12:41:45

+0

......表明歸屬問題早已解決;如果你堅持,你可以去查閱Meta中的討論。決議是允許使用「我們」這個詞來表示這種聯繫。這個特定的答案是在有政策之前寫的,所以沒有遵循政策。我現在正在編輯遵循策略的答案。如果您知道其他人沒有,請通過電子郵件向我發送一份清單(或在這裏留言),我會相應地修改它們。自決議以來,我一直嚴格遵循政策。 – 2015-09-02 12:44:03

5

只是爲了更新答案。您可能還想查看phpDocumentor2項目。我認爲這是PHP DocBlock解析器可以很容易地作爲獨立解決方案提取。

+2

DocBlox已與phpDocumentor合併成爲[phpDocumentor2](http://github.com/phpDocumentor/phpDocumentor2)。 – quantme 2012-07-04 07:05:39

+0

儘管我同意phpDocumentor很好,但OP明確要求**不是** phpDocumentor – icc97 2014-09-23 11:58:50

6

萬一有人需要一個正則表達式(xdazzsuggested試試這個和student310評論它的工作原理爲她/他的需求)

if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ 
    $result = array_combine($matches[1], $matches[2]); 
} 

例(Demo

<?php 
$str =' 
/**  
* @param integer $int An integer 
* @return boolean 
*/ 
'; 
if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ 
    $result = array_combine($matches[1], $matches[2]); 
} 

var_dump($result); 
3

由於furgas pointed out,我一直在使用phpDocumentor多年作爲一個獨立的項目,它工作正常。

<?php 
$class = new ReflectionClass('MyClass'); 
$phpdoc = new \phpDocumentor\Reflection\DocBlock($class); 

var_dump($phpdoc->getShortDescription()); 
var_dump($phpdoc->getLongDescription()->getContents()); 
var_dump($phpdoc->getTags()); 
var_dump($phpdoc->hasTag('author')); 
var_dump($phpdoc->hasTag('copyright')); 
相關問題