亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PEAR:使用PHPDoc輕松建立你的PEAR文檔

2019-09-08 23:11:18
字體:
來源:轉載
供稿:網友

對于一個開發人員,文檔總是最感到頭疼的事情之一。而且,很可能你對待文檔會采取截然不同的2種態度:

當你使用別人的代碼庫的時候,最希望得到的是它的技術文檔,尤其是當時間很緊,而你又不得不硬著頭皮去讀那些生澀的代碼的時候。

當寫你自己的程序的時候,最不希望做的事情卻是給它編寫專門的技術文檔,你會以種種理由給自己開脫:我的代碼已經足夠清晰了,完全不用再為它重新編寫文檔了……

也許是為了緩解這種矛盾,有很多工具可以幫助你,通過從源代碼中抽取相應的注釋,可以自動生成相應的api文檔。java中的javadoc,perl中的pod2man。相比之下,php以前似乎缺乏相應的工具,不過,隨著phpdoc的不斷完善,這種局面已經大大改觀。

在第一篇pear的編碼規則中有一條,pear程序中的注釋應該能夠被phpdoc轉換。由此可見,phpdoc在pear中的作用可不小。今天,我們將詳細討論phpdoc,這個優秀的pear程序。

1. 什么是phpdoc
PHPDoc是PEAR下面的一個非常優秀的模塊,它的目標是實現類似javadoc的功能,可以為你的代碼快速生成具有相互參照,索引等功能的API文檔。如果你使用過javadoc生成的文檔(如jdk的文檔),你會非常清楚,如果你沒有用過,那么下面是一個phpdoc生成它自己的文檔頁面的截圖:


從圖上可以知道,phpdoc生成的文檔和JAVADOC很相似,它有多種的索引方式:
Packageindex:這是按照模塊來索引
Classtree:這是按照你的php類的繼承關系,可以生成一個樹狀的索引
Modulegroups:這是按照模塊劃分
Elementlist:這是你的所有元素(類,方法,過程/函數,變量)的字母順序的索引

2. phpdoc的結構及功能
由于phpdoc本身也是符合pear的應用程序,我們首先了解一下它的結構。phpdoc是全部采用OOP的思想來編寫的,這也是PEAR所推薦的方式,phpdoc的工作原理:

  1. phpdoc掃描指定目錄下面的php源代碼,掃描其中的關鍵字,截取需要分析的注釋,然后分析注釋中的專用的tag,生成xml文件,接著根據已經分析完的類和模塊的信息,建立相應的索引,生成xml文件
  2. 對于生成的xml文件,使用定制的模板輸出為html文件。

從設計上來說,phpdoc使用了2個超類:PhpdocObject和PhpdocError。這是整個PHPDOC的基本類,這種方式也是PEAR所推薦的,也就是說當你編寫你自己的應用框架的時候,最好能夠有一個基本的超類,而其他的子類或者是功能類都有一個共同的祖先。在掃描源代碼過程中,PHPDOC使用的是類似GREP的形式,并沒有象我們通常想的那樣,使用正則表達式來實現,根據作者的解釋,他曾經嘗試過使用正則表達式,但是資源的占用和處理速度都很難令人滿意,因此采用了這種非常規的形式,具體的實現有興趣的讀者可以參看源代碼。我認為PHPDOC令人滿意的另一方面是其分析結果是以XML形式保存的,這樣就意味著其他的應用程序很容易可以共享這個數據,同時PHPDCO也提供了相應的接口,你可以實現這個接口,把API文檔生成其他的形式,比如PDF,LATEX,WORD等等。目前,PHPDOC的分析結果可以以HTML形式表現,以后可能會有更多的形式。即使是HTML形式,由于使用了模板機制(他使用了PEAR的IT和ITX模塊來實現),你可以很方便地定制成你自己需要的風格,

3. PHPDoc基礎
PHPDoc是從你的源代碼的注釋中生成文檔,因此在給你的程序做注釋的過程,也就是你編制文檔的過程。

從這一點上講,PHPdoc促使你要養成良好的編程習慣,盡量使用規范,清晰文字為你的程序做注釋,同時多多少少也避免了事后編制文檔和文檔的更新不同步的一些問題。

編制符合PHPDoc規范的注釋是非常重要的,掌握了這一點,基本上就可以利用PHPDoc為你工作了。

注釋在PHPDoc中分為文檔注釋和非文檔注釋

3.1 文檔注釋
文檔注釋實際上是一些特殊形式的多行注釋,一般是放在你需要注釋的特定的關鍵字(這些關鍵字是指將會被phpdoc分析的那些關鍵字,相關的關鍵字列表請參看后面第4節的說明)前面。下面是一個文檔注釋的例子:

/** * Common base class of all phpdoc classes (簡述,用在索引列表中) * * As a kind of common base class PhpdocObject holds * configuration values (e.g. error handling) and debugging * methods (e.g. introspection()). It does not have a constructor, * so you can always inheritig Phpdoc classes from this * class without any trouble. (詳細的功能描述) * * @author   Ulf Wendel  * @version  $Id: PhpdocObject.php,v 1.3 2001/02/18 15:29:29 uw Exp $ * @package  PHPDoc (文檔標記) */class PhpdocObject {    .....}

以上的文檔注釋將會生成如下的文檔:
<b>PhpdocObject</b>PhpdocObjectCommon base class of all phpdoc classes<b>private class PhpdocObject </b>Common base class of all phpdoc classesAs a kind of common base class PhpdocObject holdsconfiguration values (e.g. errorhandling) and debuggingmethods (e.g. introspection()). It does not have aconstructor,so you can always inheritig Phpdoc classes from
thisclass without any trouble.Authors Ulf Wendel <ulf.wendel@phpdoc.de>Version $Id: PhpdocObject.php,v 1.3 2001/02/18 15:29:29 uw Exp $

3.2 非文檔性注釋
如果你的注釋沒有放在那些phpdoc指定的關鍵字前面,那么phpdoc認為你所作的這些注釋是屬于非文檔注釋,將不會被phpdoc所分析,也不會出現在你產生的api文當中。

3.3 如何書寫你的文檔性注釋
從3.1 我們可以看到,一個文檔性的注釋,是由3個部分組成的,分別是:功能簡述區,功能詳細說明區,文檔標記區。

首先,第一行是一個注釋開始的標志"/**",然后是回車,從第2行開始就是功能簡述區,功能簡述區是以縮進的"*"開始的,在簡述的正文和這個"*"號之間用空格分隔(注意,在文檔中,都是以*開始,并且這些*保持對齊的縮進格式)。功能簡述的正文一般是簡明扼要地說明這個類,方法或者函數的功能,功能簡述的正文在生成的文檔中將顯示在索引區。

在功能簡述區后面是一個空的注釋行,用來分割簡述區和詳細說明區。功能詳細說明區也是以縮進的'*"來引導的,這部分主要是詳細說明你的API的功能,用途,如果可能,也可以有用法舉例等等。在這部分,你應該著重闡明你的API函數或者方法的通常的用途,用法,并且指明是否是跨平臺的(如果涉及到),對于和平臺相關的信息,你要和那些通用的信息區別對待,通常的做法是另起一行,然后寫出在某個特定平臺上的注意事項或者是特別的信息,這些信息應該足夠,以便你的讀者能夠編寫相應的測試信息,比如邊界條件,參數范圍,斷點等等。

在功能詳細說明區后面,是空白的注釋行,然后是文檔標記區,你可以在這些書寫相關的文檔標記(這些文檔標記的用法請參考后面的第4節),指明一些技術上的細節信息,最主要的是調用參數類型,返回值極其類型,繼承關系,相關方法/函數等等。多個文檔標記應該使用相同的縮進,組成一個"標記塊",便于閱讀和分析。

在文檔標記區下面的一行就是注釋結束行"*/",注意,在注釋結束標記*/后面應該直接跟一個回車,不要另外附加其他的東西,否則可能造成PHPDOC分析出錯。

以上就是書寫一個文檔性注釋的基本方法,下面我們討論一下書寫文檔時的規范和技巧。

3.4 文檔書寫指南
在你描述你的代碼的用途或者是功能的時候,最好能夠遵循大多數人的習慣,通俗地講就是"你告訴我的信息正是我想要知道的"。為此,這里將介紹一些書寫文檔注釋的技巧和規范,希望能夠對你有所幫助:

  1. 使用 <code> 來標志關鍵字和命名及相關的代碼。如果在文檔中需要引用一些關鍵字,變量名,或者是你要給出一些代碼的例子,那么你最好使用<code></code>來將這些關鍵字,變量名,代碼片段和你的文檔分隔開,這樣,讀者閱讀的時候,將會知道,這些將是運行的代碼,關鍵字而不是你的描述性的語言。
  2. 使用簡單,明確的語言,避免冗長,復雜,晦澀的長句來描述。尤其是在功能簡述,參數說明等索引部分中,盡量使用簡單明白的語言揭示主要的信息,把其他的細節放在詳細說明部分去闡述。如果你使用英語,建議使用短語而不一定是句子。
  3. 如果使用英語,建議使用第3人稱單數的形式來說明
  4. 在給方法,函數說明的時候,你需要說明的是這個方法"作了什么",而不是"怎么做"。因此,建議你的說明是以動詞開始,比如"返回記錄數","刪除給定的記錄"等等。
  5. 當你引用的某個對象或者變量是從當前的類中建立的,那么使用 "this" 代替 "the" 來指代那個對象或者是變量
  6. 避免空話,廢話,對于你所要給出的API,在你的API后面要有它的功能描述,是其能夠"自成文檔"。所謂的空話,廢話是指,你的描述不是功能描述,而只是API名稱的簡單重復和羅列,或者是用另一個API來解釋這個API,到頭來,你的讀者也不知道你所要表達的內容實質。你的描述,應該是那些從你的類名,方法名,或者是函數名看不到的補充的信息,而不是把你的API名稱再重復一遍。很多人可能很多人(包括我)不知不覺中就犯了這個錯誤,下面是一個例子:
    /**     * 設置用戶記錄集     *     * @param text  給定的表名     */    function set_user_record($table) {

你從上面這段注釋中能夠知道什么?因此,這段注釋實際上是廢話,因為你從函數名稱上是可以看出的,下面是改進后的:

/**     * 打開系統用戶表并設置為當前用戶記錄集,此記錄集將用于隨后相關用戶數據更新操作的缺省記錄集。
如果失敗則拋出一個數據庫錯誤。     *     * @param text  要打開的系統用戶表的表名。     */    function set_user_record($table) {

  • 適當地使用鏈接。為你文檔中引用的API名稱(包括你的其他類及方法,PHP的函數等)添加適當的鏈接是很受歡迎的:你可以使用@link標記來添加到相關的API的鏈接,不過,你沒有必要為文檔中引用的所有的API都添加連接,這樣會很不美觀,這里有一個簡單的標準:如果用戶在這個地方看到某個API,確實希望要去點擊以便獲取更多信息,這樣有助于他們去理解你的文檔,并且即使添加了鏈接,只在它第一出現的是時候添加,沒有必要重復添加相同的LINK。
  • 由于PHPDOC的功能限制,一個PHP文件只定義一個類或模塊,不要把類和模塊的定義放在同一個文件里,否則PHPDOC可能無法工作,至少目前版本是這樣。如果你的框架使用OOP來構建,應避免同時使用模塊或模塊組;同時應該仔細規劃你的應用結構,你的應用框架應該是一個類似樹型的結構,頂層的分支不要太多,例如你可以設計2個超類,分別是作為正常應用和錯誤處理的超類,其余的都從這2個類派生出來。

    4. PHPDoc關鍵字及文檔標志
    4.1 關鍵字
    class 、function 、var 、include (include_once, require, require_once) 、define

    在以上這些關鍵字前面所做的注釋,都被認為是文檔性注釋。

    4.2 文檔標記
    說明:使用范圍是指該標記可以用來修飾的關鍵字,或其他文檔標記
    @abstract 使用范圍:class, function, var
    說明當前類是一個抽象類。

    注釋:從PHP語言角度來說,它并不象JAVA,C++那樣,支持抽象類這個概念。也沒有相應的關鍵字來修飾某個類是抽象類。由于PHPDOC實際上大部分是借鑒了JAVADOC的做法,因此很多文檔標記也是直接從JAVADOC中沿襲過來,如abstract,access,final等等。雖然這些特性沒有從語言級別得到支持,不過從使用者角度來遵循這些特性,仍是值得推薦的。

    舉例:

    /*** 這是一個繪五星圖案的抽象類.* @abstract*/class paint_start {  /**  * 繪制數量  * @abstract  */  var $number;  /**  * 繪制五星圖案  * @abstract  */  function paint() {    ;  }}
    @access (public|private) 使用范圍:class, function, var, define, module

    指明這個變量、類、函數/方法的存取權限。如果你的函數是內部使用,你應該指明它為private,這樣的好處是,即使PHP不能阻止其他的人使用你的私有數據,但是至少你向你的用戶傳達這樣的信息,這是一個私有的函數,因此不保證在將來的版本中仍存在;對于使用者而言,表示為@private的數據和方法,你不應該直接使用,即使你可以這樣做。

    舉例:

    /*** 這是一個繪五星圖案的抽象類.* @abstract* @access    public*/class paint_start {    /**  * 繪制數量  * @abstract  * @access    private  */  var $number;  /**  * 繪制五星圖案  * @abstract  * @access    public  */  function paint() {    ;  }}
    @author Name [<email>] [, ...] 使用范圍:class, function, var, define, module, use

    指明作者信息,依次是作者姓名,email地址,其他的通訊信息。如果有多個作者,按照其先后次序,使用多個@author依次列出:

    • * @author Night Sailer <night@hotmail.com>
    • * @author Lee Tester <tester@gnome.org>
    @brother (function()|$variable) 使用范圍:class, function, var, define, module, use
    @sister (function()|$variable) 使用范圍:class, function, var, define, module, use

    指出兄弟類、函數或者是變量.這些函數、類、變量等有相似的信息和并實現相同的功能。比如,調用和返回的參數的個數和類型相同,實現的功能也一樣。這種情況,你可以使用@brother 或者 @sister指明它的兄弟函數,無須在重復書寫函數的功能等信息了。

    舉例:

    /*** 這是一個繪五星圖案的抽象類.* @abstract* @access    public*/class paint_start {    /**  * 繪制數量  * @abstract  * @access    private  */  var $number;  /**  * 繪制五星圖案  * @abstract  * @access    public  */  function paint() {    ;  }  /**  * @brother paint()   */  function draw() {    ;  }}

    @const[ant] label [description] 使用范圍:define
    指明常量
    這個標記實際上是用來說明php的define關鍵字定義的常量。

    @copyright description 使用范圍:class, function, var, module, define, use
    指明版權信息。

    @deprec[ated] label 使用范圍:class, function, var, module, define, use
    指明不推薦或者是廢棄的信息.

    如果你的某個函數或者方法,已經被新的函數方法替代,或者是已經廢棄,不希望讀者繼續使用。那么你可以使用這個標志告訴讀者,這個函數只是為了保持兼容性而保留的,它不被推薦使用,如果它已經被其他函數替代,也要指出這個替代者。

    例子:

    /*** 過時的類** @deprec  1.5-2000/12/06* @access  public*/function dontUseMeAnyMore() {  print "Don't use me any more. I have been deprecated.";}

    @exclude label 使用范圍:class, function, var, module, define, use
    指明當前的注釋將不進行分析,不出現在文擋中

    @final 使用范圍:class, function, var
    指明這是一個最終的類、方法、屬性,禁止派生、修改。
    舉例:

     /**  * 圓周率    * @final  */  var $PI = 3.1415926;

    @global (object objecttype|type) [$varname] [description] 使用范圍:function
    指明在此函數中引用的全局變量
    舉例:

    /*** Simuliert include_once in PHP 3.** @global  array   $__used_files   已經include的文件列表* @access  public*/function include_once($filename) {  global $__used_files;  if (!isset($__used_files["include_once"][$filename])) {    $__used_files["include_once"][$filename] = true;    include($filename);  }}

    @include description 使用范圍:use
    指明包含的文件的信息。
    舉例:

    /*** 抽象繪圖類的定義.** @includeFunction: _require_*/require("abstract.php");

    @link URL description 使用范圍:class, function, var, module, define, use
    定義在線連接,如上面3.4中講到的,你可以使用@link添加適當的在線鏈接。
    例如:@link http://www.phpdoc.de/ PHPDoc Home

    @magic description
    這個標記在phpdoc中沒有說明,具體用法現在仍不清楚

    @module label 使用范圍:module
    定義歸屬的模塊信息,label是模塊的名字,擁有相同的模塊名字的函數在索引分類中將被組合在一起。如果你沒有使用OOP的思想來編寫PEAR代碼,那么建議你使用這個標記把相關的函數歸集到相應的模塊下面,這樣你的整體的框架不至于過于零散和混亂。

    @modulegroup label 使用范圍:module
    定義歸屬的模塊組 label是這個模塊組的名字,如果你的應用程序的模塊很多,你可以把不同的模塊按照邏輯功能的不同,劃分成相應的模塊組,這樣,你的應用框架可以有比較清晰的邏輯關系。這是對于沒有使用OOP編程的來說的,如果使用OOP的思想,沒有必要使用模塊組的概念,因為直接使用"包-超類--基類--子類"的形式來體現你的框架結構要比使用"包-模塊組-模塊"的形式好的多。

    @package label 使用范圍:class, module
    定義歸屬的包的信息,label 是這個包的名字。相同的包的名字的類在最終文檔索引中將被分在一起。實際上,包還可以理解為不同的名字空間,雖然PHP沒有名字空間的概念,但是你可以把相關的類、模塊都歸屬于同一個包,這樣,相當于組織了一個名字空間,當然,你的應用框架可能會有不同的包,可惜的是,這種情況下從語法上是得不到名字空間這種保證的,你只能通過人為地去避免不同的包的函數或者類重名。

    @param[eter] (object objecttype|type) [$varname] [description] 使用范圍:function
    定義函數或者方法的參數信息。這是最常使用的文檔標記了。

    ojecttype 是對象的類名,type 指出這個參數的類型,它可以是下列類型:

    • string 該參數是一個字符型變量。
    • array 該參數是一個數組。
    • integer 該參數是一個數值型。
    • integer (octal) 該參數是一個數值型,并且是按照八進制方式存放。
    • integer (hexadecimal) 該參數是一個數值型,并且是按照十六進制方式存放。
    • boolean 該參數是一個布爾型。
    mixed 該參數的類型是可變的,可以上面幾種類型的組合。不過,在隨后的說明中一般要說明可以接受的變量的類型。
    $varname 是形參的名稱
    [description] 是對于參數的說明。
    如果函數接受的是多個參數,那么要按照從左到右,依次用@param對齊列出,如下面所示:
       *    * @param    array    $tags      array of tags returned by getTags    * @param    array    $data      array where the allowed tags
    and their values are copied to    * @param    array    $allowed   array of allowed (recognized) tags

    @return (object objecttype|type) [$varname] 使用范圍:function
    定義函數或者方法的返回信息。
    返回信息的類型同@param一樣,$varname是返回變量的名稱,可有可無。不同的是@return只有一個,不會出現多個@return

    @see (function()|$varname|((module|class)::)(function()|$varname)) [, ...] 使用范圍:class, function, var, module, define, use
    定義需要參考的函數、變量,并加入相應的超級連接。這也是較常用的標記。對于相關的函數,變量,你可以使用@see來增加一個到相關函數和變量的鏈接。多個相關的函數、變量寫在一行,中間用逗號來分隔。
    參考的函數、變量如果是當前類或模塊的,那么你可以直接寫函數、或者變量的名,如果是函數那么要在函數名后面加上括號(),變量名要加上$。需要注意的,這里所謂的變量名也應該是你用@var來說明過的,否則,phpdoc將無法找到相關的參照而報錯。
    如果你想引用其他類或者其他模塊的函數或者是變量,那么,你可以在函數名、變量名前面加上類或模塊的名字作為范圍指示,中間用::來分隔。

    下面是一些例子:
    @see $run_time,$idle_time,$begin_time,$end_time
    @see getRuntime(), getIdletime(),getBegintime(),getEndtime()
    @see TIME::$run_time, TIME::getBegintime()

    @since label 使用范圍: class, function, var, module, define, use
    指明該api函數或者方法是從哪個版本開始引入的。

    @static 使用范圍:class, function, var
    指明變量、類、函數是靜態的。

    @throws exception [, exception] 使用范圍: function
    指明此函數可能拋出的錯誤異常,極其發生的情況
    如果你預料到在這個函數中有產生異常的條件,那么你可以使用@throws標記來說明這些異常是什么,什么情況下產生異常。比如,讀取磁盤文件出錯,無法連接數據庫,網絡連接超時或者是在一些情況下,你"故意"拋出的異常等等。

    @todo 使用范圍:class, function, module, use
    指明應該改進或沒有實現的地方

    @var[iable] (object objecttype|type) [$varname] [description] 使用范圍:var
    定義說明變量/屬性。
    object objecttype|type 定義你的變量的類型,同@param一樣
    $varname 該變量的名字,你可以從其他地方使用@see來引用這個名字
    description 對變量的描述

    @version label 使用范圍:class, function, module, use
    定義版本信息.
    你當然可以自己手工寫這些版本信息,不過PEAR推薦你使用CVS的$Id標記來自動標示你的版本信息。形式如下:

    @version $Id
    這樣,當你checkout的時候,CVS自動會擴展成: @version $Id: PhpdocParserCore.php,v 1.4 2001/02/18 14:45:27 uw Exp

    5. 生成文檔
    5.1 安裝PHPDOC
    安裝PHPDOC很簡單,實際上因為它已經隨同PHP 4.05一同發布了,所以如果你的PHP是4.05,那么在PEAR目錄下面會發現PHPDOC這個模塊.如果你沒有發現,你可以從PHPDOC的CVS獲得一份最新的源碼.

    5.2 運行PHPDOC
    運行PHPDOC需要做一些準備工作,首先要調整你的PHP.INI的參數,

    因為PHPDOC運行的時間比一般的PHP應用要長,很可能會超過你在PHP.INI中定義的最大運行時間(缺省是30秒),根據作者的建議:PIII,60秒,120秒PII,240秒MMX200,480秒如果配置更低的話。如果出現超時,你可以自己適當延長這些數值。

    在php.ini中修改:

    ;;;;;;;;;;;;;;;;;;;; Resource Limits ;;;;;;;;;;;;;;;;;;;;max_execution_time = 480memory_limit = 8388608

    如果你不愿意或者沒有修改php.ini的權限,那么你可以使用set_time_limit()函數來設置這個時間,使用方法: set_time_limit(480); 設置從此點開始,運行480秒后才超時。將這個函數加在index.php中,就可以和修改php.ini達到同樣的效果。

    其次,你要修改phpdoc目錄下面的index.php文件:

    // Directory with include filesdefine("PHPDOC_INCLUDE_DIR", "c:/www/apache/doc/");
    將"c:/www/apache/doc/修改成你的phpdoc的目錄
    // Important: set this to the Linebreak sign of your system!
    define("LINEBREAK", "/r/n");

    這是定義換行的標志,DOS下面是換行+回車,UNIX下面只是回車就可以。

    下面,為你的要生成文檔的應用程序做一些定制工作:

    // Sets the name of your application.// The name of the application is used e.g. as a page title$doc->setApplication("PHPDoc");setApplication()用來設置你的應用程序的名稱,將PHPDOC替換成你應用程序的名字。// directory where your source files reside:$doc->setSourceDirectory(PHPDOC_INCLUDE_DIR);setSourceDirectory()設置你的應用程序的PHP源文件所在的目錄,
    將PHPDOC_INCLUDE_DIR替換成你實際的目錄。// save the generated docs here:$doc->setTarget(PHPDOC_INCLUDE_DIR."apidoc/");setTarget()設置你的API文檔存放的目錄,PHPDOC將在這個目錄下面生成XML及HTML文件。
    將PHPDOC_INCLUDE_DIR."apidoc/"替換成你自己的目錄。// use these templates:$doc->setTemplateDirectory(PHPDOC_INCLUDE_DIR."renderer/html/templates/");setTemplateDirectory()設置HTML所使用的模板的目錄。如果你需要使用定制的模板,
    可以使用這個函數設置你自己的模板文件所在的目錄。// source files have one of these suffixes:$doc->setSourceFileSuffix( array ("php", "inc") );setSourceFileSuffix()用來設置需要分析的PHP源文件的擴展名,如果你使用了別的擴展名,
    需要在這里添加,比如如果你有以前的php3文件,需要添加:$doc->setSourceFileSuffix( array ("php", "inc","php3") );
    這樣,基本的定制工作就完成了,現在你可以在瀏覽器中運行index.php,出現了歡迎信息后,就是開始分析文檔了.根據機器的狀況和所分析的源代碼文件的數量不同,文檔分析過程所需的時間也不會相同.文檔分析結束后,瀏覽器會顯示FINISH的字樣,表明分析完成,你可以在剛才指定的目錄下面找到分析結果,包括HTML和XML文件.

    5.3 實用工具
    通過PHPDOC的INDEX.PHP雖然可以產生文檔,但是畢竟不是那么方便,這里我給出了一個自己寫的shell程序 makeapidoc ,你可以用它來方便的產生你的API文檔,無須每次都要修改,也不用非要啟動瀏覽器來執行。

    用法如下:makeapidoc -t 你的應用程序的標題 -s 源程序目錄 -d 生成文檔存放目錄

    在使用之前,先修改下面2行:
    PHPDOC_DIR="/usr/local/lib/php/pear/PHPDoc" # windows: c:/php/pear/PHPDoc
    PHPBIN="/usr/local/bin/php" #windows: c:/php/php.exe
    PHPDOC_DIR是PHPDOC的目錄,PHPBIN是PHP可執行文件的路徑。

    這個程序實際上是把PHP作為一個SHELLSCRIPT來使用了,不過是嵌在BASH中使用,實際上PHP完全可以做為普通的SHELL腳本一樣運行,只需加上 -q 參數,這樣就不打印HTTP HEADER了。

    6. 進階:定制輸出的文檔
    如果你認為缺省的PHPDOC產生的HTML文檔不夠美觀,你想做進一步的改進,比如你想把一些注釋換成中文或者是其他的文字,你想加入你的LOGO,或者是你的聯系方式,換成一個漂亮的背景圖案,有沒有方法可以作到?答案是當然可以,并且非常簡單.

    PHPDOC在輸出HTML格式的API文檔的時候,使用的是PEAR的IT,ITX模塊,這是類似PHPLIB的TEMPLETE.CLASS的PEAR模塊,因此,你可以方便地定制和修改缺省的模板來為你所用.

    我們先看看PHPDOC/renderer/html/templates: class.html classtree.html elementlist.html frame_packageelementlist.html
    frame_packagelist.html module.html modulegroup.html packagelist.html phpdoc.css warnings.html xmlfiles.html

    你會看到上面的這些文件,沒錯,這些就是PHPDOC用來產生API HTML的模板,現在你可以用你的編輯器來修改這些模板了,這里給出基本的修改原則:

    1. 對于用{}圈起來的標記,這些是一些變量的標記,在運行時刻,PHPDOC將會用實際的變量值替換到相應的位置.因此,你務必要保留全部的變量標記,否則運行時將會出錯.
    2. 你要注意<!--Begin Xxx-loop --><!--End Xxx -loop-->之類帶LOOP的注釋,在這2個標記中間的部分,將會用于循環輸出,所以,你在設計模板時要考慮到循環使用,是否會破壞你頁面的美觀,最簡單的比如:如果循環的部分是在一個表格內,你要用<tr>用來分隔各循環調用的部分,同時應該保證各個<TD></TD>是匹配關閉的.
    3. 當你修改的地方不大,你也可以直接修改樣式表phpdoc.css的內容,這樣也可以達到你要求的效果
    4. 你可以把模板存放在不同的目錄,通過setTemplateDirectory()設置不同的模板路徑,就可以生成不同格式的API文檔

    7. 參考資源

    • PHPDOC HOME
    • PHPDOC CVS

    作者簡介
    潘凡(Night Sailer):北京賽迪數據有限公司工程師。主要從事是數據的分析和轉換,以及相關的開發工作。擅長使用VB,PERL,PHP進行開發以及Linux的中文化工作。近期興趣是Perl,Php與XML的應用,PHP的MVC開發模式,PERL-GTK的使用。您可以通過 E-mail:nightsailer@hotmail.com 跟他聯系。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久在线播放| 尤物九九久久国产精品的分类| 久久久亚洲网站| 亚洲国产第一页| 久久久久久久久久久网站| 久久全球大尺度高清视频| 亚洲xxx视频| 久久久视频免费观看| 亚洲午夜国产成人av电影男同| 成人a视频在线观看| 美日韩丰满少妇在线观看| 亚洲国产精品久久久久久| 色综久久综合桃花网| 亚洲第一区在线观看| 美女999久久久精品视频| 日韩av影片在线观看| 黑人巨大精品欧美一区二区| 精品国产欧美一区二区五十路| 国产成人鲁鲁免费视频a| 中文字幕精品av| 精品久久香蕉国产线看观看gif| 久久久久久久久久亚洲| 97碰在线观看| 国产香蕉一区二区三区在线视频| 亚洲sss综合天堂久久| 97国产精品久久| 成人国产精品av| 韩国19禁主播vip福利视频| 中文字幕一区二区三区电影| 亚洲国产成人精品久久| 国产一区二区三区视频在线观看| 2019亚洲日韩新视频| 国产精品2018| 国产成人精品国内自产拍免费看| 亚洲国产99精品国自产| 日韩亚洲第一页| 日韩电影网在线| 中文字幕精品一区二区精品| 久久中国妇女中文字幕| 成人两性免费视频| 在线观看久久av| 欧美在线免费观看| 亚洲色图50p| 日韩精品在线免费| 欧美与欧洲交xxxx免费观看| 国产一区二区三区网站| 亚洲激情第一页| 国产在线观看精品| 国产日韩av在线播放| 久久久久久69| 亚洲男人天堂网站| 日韩av大片在线| 亚洲国产精品成人va在线观看| 91精品国产99久久久久久| 欧美另类69精品久久久久9999| 日韩av在线不卡| 国产伦精品一区二区三区精品视频| 国产成人精品av| 自拍视频国产精品| 亚洲欧美国产日韩天堂区| 国产福利视频一区二区| 日本sm极度另类视频| 精品亚洲永久免费精品| 日韩欧美在线字幕| 国产香蕉一区二区三区在线视频| 欧美极度另类性三渗透| 精品国产福利视频| 午夜精品久久久久久99热软件| 91网站在线免费观看| 国产精品久久久久9999| 亚洲已满18点击进入在线看片| 欧美日韩国产成人在线| 亚洲伊人一本大道中文字幕| 日韩av电影在线播放| 黑人巨大精品欧美一区二区免费| 亚洲欧美日韩国产中文| 亚洲女同性videos| 亚洲精品国产精品久久清纯直播| 欧洲日韩成人av| 亚洲跨种族黑人xxx| 成人av在线亚洲| 热久久免费视频精品| 国产美女精品免费电影| 亚洲一区二区三区香蕉| 91美女片黄在线观| 91热福利电影| 国产ts一区二区| 美女啪啪无遮挡免费久久网站| 亚洲无av在线中文字幕| 久久久精品影院| 亚洲女人被黑人巨大进入| 日韩免费精品视频| 亚洲欧美激情四射在线日| 日韩女优人人人人射在线视频| 国产精品成人va在线观看| 欧美猛交ⅹxxx乱大交视频| 中文字幕在线看视频国产欧美在线看完整| 成人免费在线网址| 国产精品视频在线观看| 亚洲精品在线视频| 欧美性猛交xxxx乱大交3| 久久久久久尹人网香蕉| 久久夜精品va视频免费观看| 精品久久久久久中文字幕| 久久亚洲成人精品| 亚洲伊人久久大香线蕉av| 亚洲久久久久久久久久久| 国产精品夜间视频香蕉| 成人黄色大片在线免费观看| 成人免费淫片aa视频免费| 成人免费大片黄在线播放| 性欧美亚洲xxxx乳在线观看| 欧美日韩国产在线看| 国产精品高潮呻吟久久av黑人| 国产精品视频免费在线观看| 精品久久久久久久久中文字幕| 中文字幕成人精品久久不卡| 成人黄在线观看| 中文字幕欧美精品日韩中文字幕| 91精品免费久久久久久久久| 欧美一级大胆视频| 亚洲综合大片69999| 久久亚洲影音av资源网| 成人黄色片在线| 中文字幕精品在线| 亚洲免费一级电影| 亚洲电影天堂av| 国产视频精品一区二区三区| 日韩专区在线观看| 精品无人区乱码1区2区3区在线| 狠狠操狠狠色综合网| 国产精品视频成人| 国产专区欧美专区| 中文字幕国产亚洲2019| 国产精品一二区| 欧美小视频在线观看| 亚洲欧美中文另类| 欧美一级成年大片在线观看| 136fldh精品导航福利| 成人黄色免费看| 国产精品网站入口| 亚洲一区第一页| 91精品免费看| 91大神在线播放精品| 欧美精品久久久久a| 精品久久久久久久久久久久| 久久全球大尺度高清视频| 在线精品视频视频中文字幕| 青青草原成人在线视频| 欧洲成人在线观看| 91亚洲人电影| 久久精品亚洲精品| 亚洲天堂男人天堂女人天堂| 亚洲a一级视频| 久久成人精品电影| 欧美日韩在线免费观看| 日韩第一页在线| 国产中文欧美精品| 欧美亚洲国产另类| 中文字幕久热精品视频在线| 亚洲视频欧洲视频| 91沈先生作品| 亚洲精品日韩激情在线电影| 亚洲欧美日韩久久久久久|