| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> php >> PHP PEAR簡介
 

PHP PEAR簡介

2008-12-28 07:39:33  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  什麽是PEAR

  PEAR是PHP擴展與應用庫(the PHP Extension and Application Repository)的縮寫。它是一個PHP擴展及應用的一個代碼倉庫,簡單地說,PEAR就是PHP的CPAN。

  爲什麽要使用PEAR?

  PHP是一個非常優秀的腳本語言,簡潔、高效,隨著4.0的發布,越來越多的人使用它來進行動態網站的開發,可以說,PHP已經成爲最優秀的INTERNET開發語言之一,尤其對于那些需要能夠快速、高效地開發中小規模的商業應用的網站開發人員,PHP是其首選的語言。但是隨著PHP的應用的不斷增多,對于這些應用缺乏統一的標准和有效的管理,因此,PHP社區很難象PERL社區的人們那樣方便的共享彼此的代碼和應用,因爲PHP缺乏象CPAN那樣的統一的代碼庫來分類管理應用的代碼模塊(熟悉PERL的人都知道,CPAN是一個巨大的PERL的擴展模塊倉庫,編寫的應用模塊可以放在CPAN下面的適當的分類目錄下面,其他的人可以很方便地複用,當然,你編寫應用模塊時候也需要遵守其中的准則。)

  爲此,PEAR就應運而生了,並且從4.04開始,隨著PHP核心一起被分發。

  PEAR能給我帶來什麽好處?

  1.如前所述,PEAR按照一定的分類來管理PEAR應用代碼庫,你的PEAR代碼可以組織到其中適當的目錄中,其他的人可以方便地檢索並分享到你的成果。

  2.PEAR不僅僅是一個代碼倉庫,它同時也是一個標准,使用這個標准來書寫你的PHP代碼,將會增強你的程序的可讀性,複用性,減少出錯的幾率。

  3.PEAR通過提供2個類爲你搭建了一個框架,實現了諸如析構函數,錯誤捕獲功能,你通過繼承就可以使用這些功能。

  PEAR的編碼規則

  PEAR的編碼規則包括縮進規則,控制結構,函數調用,函數定義,注釋,包含代碼,PHP標記,文件頭的注釋塊,CVS標記,URL樣例,常量的命名這11方面。下面簡要地介紹一下:

  縮進規則:

  PEAR中需要使用4個空格來縮排代碼,並且不使用TAB。如果你使用VIM,將下列設置放入你的~/.vimrc中:set expandtab

  set shiftwidth=4

  set tabstop=4

  如果,你使用Emacs/XEmacs,需要把indent-tabs-mode 設置成nil。

  不過你象我一樣喜歡用(X)Emacs編輯PHP文件,我強烈推薦你安裝PHP-MODE,這樣當你編寫PEAR代碼的時候,它會自動調整你的縮排風格,當然PHP-MODE還有許多很優秀的特性,你可以從資源列表中的地方下載最新版的PHP-MODE。

  控制結構:

  這裏所說的控制結構包括: if for while switch 等。對于控制結構,在關鍵字(如if for ..)後面要空一個格,然後再跟控制的圓括號,這樣,不至于和函數調用混淆,此外,你應該盡量完整的使用花括號{},即使從語法上來說是可選的。這樣可以防止你以後需添加新的代碼行時産生邏輯上的疑惑或者錯誤。這裏是一個樣例:if ((條件1) && (條件2)) {

   語句1;

  }esleif ((條件3) || (條件4)) {

   語句2;

  }else {

   語句3;

  }

  函數調用:

  對于函數調用,函數名和左括號( 之間不應該有空格,對于函數參數,在分隔的逗號和下一個參數之間要有相同的空格分離,最後一個參數和右括號之間不能有空格。下面是一個標准的函數調用;$result = foo($param1, $param2, $param3);

  不規範的寫法:

  $result=foo ($param1,$param2,$param3);

  $result=foo( $param1,$param2, $param3 );

  此外,如果要將函數的返回結果賦值,那麽在等號和所賦值的變量之間要有空格,同時,如果是一系列相關的賦值語句,你添加適當的空格,使它們對齊,就象這樣:$result1 = $foo($param1, $param2, $param3);

  $var2 = $foo($param3);

  $var3 = $foo($param4, $param5);

  函數定義:

  函數定義遵循"one true brace"習俗:function connect(&$dsn, $persistent = false)

  {

   if (is_array($dsn)) {

   $dsninfo = &&dsn;

   } else {

   $dsninfo = DB::parseDSN($dsn);

   }

   if (!$dsninfo || !$dsninfo['phptype']) {

   return $this->raiseError();

   }

   return true;

  }

  如上所示,可選參數要在參數表的末端,並且總是盡量返回有意義的函數值。

  關于注釋:

  對于類的在線文檔,應該能夠被PHPDoc轉換,就象JavaDoc那樣。PHPDoc也是一個PEAR的應用程序,更詳細的介紹你可以去 http://www.phpdoc.de/ 查看。除了類的在線文檔,建議你應該使用非文檔性質的注釋來诠釋你的代碼,當你看到一段代碼時想:哦,我想不需要在文檔裏去仔細描述它吧。那麽你最好給這段代碼作一個簡單的注釋,這樣防止你會忘記它們是如何工作的。對于注釋的形式,C的 /* */和C++的//都不錯,不過,不要使用Perl或者shell的#注釋方式。

  包含代碼:

  無論什麽時候,當你需要無條件包含進一個class文件,你必須使用requre_once;當你需要條件包含進一個class文件,你必須使用include_once;這樣可以保證你要包含的文件只會包含一次,並且這2個語句共用同一個文件列表,所以你無須擔心二者會混淆,一旦require_once 包含了一個文件,include_once不會再重複包含相同的文件,反之亦然。

  PHP代碼標記:

  任何時候都要使用<?php ?>定義你的php代碼,而不要簡單地使用<? ?>,這樣可以保證PEAR的兼容性,也利于跨平台的移植。

  文件頭的注釋聲明:

  所有需要包含在PEAR核心發布的PHP代碼文件,在文件開始的時候,你必須加入以下的注釋聲明:/* vim: set expandtab tabstop=4 shiftwidth=4: */

  // +----------------------------------------------------------------------+

  // | PHP version 4.0 |

  // +----------------------------------------------------------------------+

  // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |

  // +----------------------------------------------------------------------+

  // | This source file is subject to version 2.0 of the PHP license, |

  // | that is bundled with this package in the file LICENSE, and is |

  // | available at through the world-wide-web at |

  // | http://www.php.net/license/2_02.txt. |

  // | If you did not receive a copy of the PHP license and are unable to |

  // | obtain it through the world-wide-web, please send a note to |

  // | license@php.net so we can mail you a copy immediately. |

  // +----------------------------------------------------------------------+

  // | Authors: Original Author |

  // | Your Name |

  // +----------------------------------------------------------------------+

  //

  // $Id$

  對于不在PEAR核心代碼庫中的文件,建議你也在文件的開始處有這樣一個類似的注釋塊,標明版權,協議,作者等等。同時也在第一行加入VIM的MODELINE,這樣在VIM中能夠保持PEAR的代碼風格。

  CVS標記:

  如上面所展示那樣,在每個文件中加入CVS的ID標記,如果你編輯或修改的文件中沒有這個標記,那麽請加入,或者是替換原文件中相類似的表現形式(如"Last modified"等等)

  URL樣本:

  你可以參照RFC 2606,使用"www.example.com"作爲所有的URL樣本。

  常量命名:

  常量應該盡量使用大寫,爲了便于理解,使用下劃線分割每個單詞。同時,你應該常量所在的包名或者是類名作爲前綴。比如,對于Bug類中常量應該以Bug_開始。以上是PEAR的編碼規則,詳細的編碼規則可以參考PEAR中的CODING_STANDDARD文件的說明。爲了更好地理解這些編碼規則,你也可以參考一下現有PEAR核心模塊的代碼。

  開始使用PEAR

  PEAR

  使用PEAR很簡單,你只需這樣定義你自己的PEAR程序:require_once "PEAR.php";

  class your_class_name extends PEAR{

  你的類定義...

  }

  當然,你需要遵守前面說的PEAR的編碼規則,之後你就可以在你的類內部實現你要做的事情了。下面,我們展開討論一下,實際上PEAR爲我們提供了2個預定義類: PEAR:這是PEAR的基類,所有的PEAR擴展都要從它繼承派生出來。 PEAR_Error:PEAR的錯誤處理的基類,你可以選擇派生出自己的錯誤處理的類。

  一般來說,你不應該直接創建PEAR的實例,而是要自己派生出一個新的類,然後再創建這個新類的實例。作爲基類,PEAR給我們提供了一些有用的功能,最主要的就是析構函數和錯誤處理

  析構函數

  PHP支持構造函數,但是並不支持析構函數,不過,PHP提供register_shutdown_function()這個函數,從而能夠在腳本終止前回調注冊的函數,因此PEAR利用這個特性,提供了析構函數的仿真。假如你有一個PEAR的子類,叫做mypear,那麽在mypear類中,你可以定義一個函數,函數名是下劃線加上你的類名,_mypear(),這個函數就是這個類的析構函數。不過這個析構函數和C++中的析構函數不太一樣,它不會在對象被刪除的時候執行,而是在腳本結束的時候,畢竟這只是一個仿真。由于是使用了register_shutdown_function(),所以在你的析構函數裏,打印的信息將不會返回浏覽器中。此外,在你的構造函數中,需要調用一下它的父類的構造函數,因爲PHP不會自動調用父類的構造函數,而析構函數需要在PEAR的構造函數中注冊,我們可以看看PEAR的源代碼:<code>

  function PEAR() {

  if (method_exists($this, "_".get_class($this))) {

   global $_PEAR_destructor_object_list;

   $_PEAR_destructor_object_list[] = &this;

  }

  if ($this->_debug) {

   printf("PEAR constructor called, class=%s\n",

   get_class($this));

  }

  .....

  function _PEAR_call_destructors() {

   global $_PEAR_destructor_object_list;

   if (is_array($_PEAR_destructor_object_list) && sizeof($_PEAR_destructor_object_list)) {

   reset($_PEAR_destructor_object_list);

   while (list($k, $objref) = each($_PEAR_destructor_object_list)) {

   $destructor = "_".get_class($objref);

   if (method_exists($objref, $destructor)) {

   $objref->$destructor();

   }

   }

   //清空已注冊的對象列表,

   //防止重複調用

   $_PEAR_destructor_object_list = array();

   }

  }

  ....

  register_shutdown_function("_PEAR_call_destructors");

  </code>

  上面這段代碼展示了PEAR是如何實現析構函數的,在構件函數中,將檢查當前類中是否有析構函數,如果有,那麽將把當前類的引用放入一個全局列表中,在_PEAR_call_destructors中,則檢查這個全局列表中的每個元素是否存在相應的析構函數,如果有,則調用它,最後將全局列表清空。

  在PEAR.php的最後一行代碼,則調用register_shutdown_function("_PEAR_call_destructors"),注冊_PEAR_call_destructors,這樣,當腳本執行完畢的時候,PHP會回調這個函數。使用析構函數,你可以在處理完用戶的請求,退出之前做一些必要的"善後"工作,典型的例子是,你可以關閉打開的文件,斷開數據庫的連接,將某些數據存入磁盤等等。

  錯誤處理

  PEAR中可以讓你有很多的方式來處理錯誤,你不僅僅是簡單地返回一個錯誤代碼,或者錯誤的信息,而是可以返回一個PEAR_Error對象,或者是由PEAR_Error派生出來的新的錯誤對象。

  PEAR中的錯誤對象的並沒有限定具體的輸出形式,它可以僅僅是捕獲錯誤,不給用戶返回太多的信息,也可以是去回調一個特殊錯誤處理函數,同時,即使輸出錯誤信息,它也強迫你必須要是HTML形式,你可以輸出XML,CSV形式,或者是其他你自己定義的形式,你只需要從PEAR_Error派生一個新的類,然後在適當的時候創建並"抛出"這個新類的對象就可以了。

  簡單的錯誤處理:

  在PEAR中,最簡單的錯誤處理是"抛出"這個錯誤,你只要簡單地創建並返回一個PEAR_Error的對象就可以了。下面是一個簡單的例子:<code>

  function myconnect($host = "localhost", $port = 1080)

  {

   $fp = fsockopen($host, $port, $errno, $errstr);

   if (!is_resource($fp)) {

   return new PEAR_Error($errstr, $errno);

   }

   return $fp;

  }

  $sock = myconnect();

  if (PEAR::isError($sock)) {

   print "connect error: ".$sock->getMessage()."<BR>\n"

  }

  </code>

  如上面代碼所展示的,在執行一段可能産生錯誤的代碼後,你需要使用PEAR的isError來檢測是否存在錯誤,並且可以使用PEAR_Error的getMessage來取得最近一次的錯誤信息。注意:一定要在關鍵的地方使用使用PEAR::isError

  使用raiseError

  PHP4.0.5以後,PEAR多了2個函數:

  setErrorHandling($mode, $options = null)

  raiseError($message = null, $code = null, $mode = null,$options = null, $userinfo = null)

  前者可以設置PEAR缺省的錯誤處理模式,後者是一個包裝函數,返回一個PEAR_Error的對象,和直接創建並返回PEAR_Error的對象略有不同的是,如果省略$mode,$options等參數,它會使用缺省值來創建這個PEAR_Error的對象,這些缺省值你可以使用setErrorHandling()來定制。

  PEAR_Error

  PEAR_Error是PEAR的錯誤對象的一個基類,和PEAR不同,一般來說,你可以直接創建PEAR_Error的實例,創建方式: $error = new PEAR_Error($message, $code, $mode, $options, $userinfo);

  $message是你的錯誤信息,$code是該錯誤的錯誤號,後3個參數是緊密聯系的:

  $mode:是這個錯誤的處理模式,可以下列常量:

  PEAR_ERROR_RETURN:僅僅返回該錯誤對象(缺省方式)

  PEAR_ERROR_PRINT:在構建函數中打印這個錯誤信息,但是當前程序會繼續運行。

  PEAR_ERROR_TRIGGER:使用PHP的trigger_error() 觸發一個錯誤,如果你已經設置了錯誤處理函數,或者你把PHP的錯誤處理級別設置爲E_USER_ERROR,那麽當前程序將會被終止。

  PEAR_ERROR_DIE:打印錯誤並退出,程序終止。

  PEAR_ERROR_CALLBACK:使用一個回調函數或者方法來處理當前錯誤,程序終止。

  $options:這個參數只有在$mode是PEAR_ERROR_TRIGGER和PEAR_ERROR_CALLBACK的時候才起作用,如果是PEAR_ERROR_TRIGGER,$options必須是E_USER_NOTICE, E_USER_WARNING 或 E_USER_ERROR這3個常量的一個,同PHP中trigger_error的值一致。如果$mode是PEAR_ERROR_CALLBACK,$options可以是一個字符串,內容是要回調的函數名,也可以是一個2元素的數組,分別是一個對象變量,和一個字符串(標明要調用的方法)。

  $userinfo:存放附加的用戶信息,你可以把相關的調試信息放在這裏。

  PEAR_Error中有一些常用的方法,這些方法在PHP文擋沒有描述,這裏一一列出:

  int getMode:返回當前的錯誤處理模式,整型。

  string getMessage:返回當前完整的錯誤信息,字符串。

  mixed getCallback:返回當前的回調信息,可能是所回調的函數名,或者是(對象,方法)的數組。

  int getCode:返回整型的錯誤代碼。

  string getType:返回錯誤的類型,也就是當前的類名,字符串。

  string getUserInfo:返回附加的用戶信息,字符串。

  string getDebugInfo:內容同上。

  string toString:返回當前對象的詳細字符串描述,內容包括錯誤處理的模式,級別,錯誤信息,錯誤代碼,相關回調函數等等。

  總結

  至此,對于PEAR的介紹就結束了。概括地說,如果你要做一個PEAR的擴展應用,需要這麽做:

  require_once "PEAR.php"

  使用class your_pear_extend extends PEAR{}定義你的新類。

  在你的類的構造函數中,調用父類PEAR的構造函數:function your_pear_extend{

   $this->PEAR();

   ...

  }

  如果需要,定義你的析構函數 _your_pear_extend

  如果需要,從PEAR_Error派生出你自己的錯誤處理類

  設置你的錯誤處理模式,並在適當的時候觸發錯誤。

  在執行可能産生錯誤的代碼後,用PEAR::isError($obj)捕獲相應的錯誤。

  實現你自己的功能。

  在最新的PHP4.05的PEAR核心發布裏,已經有不少優秀的應用模塊了,比如:PHPDoc,Cache,HTML...當然,相對于CPAN來說,PEAR只是剛剛起步,需要PHP社區的人們的共同努力,來完善它,增強它,PHP才會越來越強大。

  參考資料

  Pear主頁

  PHP主頁

  PHPDoc主頁,可以從你的PEAR應用源碼産生類似JAVADOC的API文檔

  PHP-Mode for XEmacs/Emacs,爲emacs/xemacs提供php的語法支持,能夠很好支持pear代碼風格

  Vim主頁,非常優秀的一個編輯器,對php的支持也很好

  關于作者

   潘凡(Night Sailer):北京賽迪數據有限公司工程師。主要從事是數據的分析和轉換,以及相關的開發工作。擅長使用VB,PERL,PHP進行開發以及Linux的中文化工作。近期興趣是Perl,Php與XML的應用,PHP的MVC開發模式,PERL-GTK的使用。您可以通過 E-mail:nightsailer@hotmail.com跟他聯系。
 
 
 
上一篇《PEAR簡介:用PEAR來寫你的下一個php程序》
下一篇《初學者學習PHP開發應該掌握的幾段精華代碼》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
什麽是PEAR PEAR是PHP擴展與應用庫(the PHP Extension and Application Repository)的縮寫。它是一個PHP擴展及應用的一個代碼倉庫,簡單地說,PEAR就是PHP的CPAN。 爲什麽要使用PEAR? PHP是一個非常優秀的腳本語言,簡潔、高效,隨著4.0的發布,越來越多的人使用它來進行動態網站的開發,可以說,PHP已經成爲最優秀的INTERNET開發語言之一,尤其對于那些需要能夠快速、高效地開發中小規模的商業應用的網站開發人員,PHP是其首選的語言。但是隨著PHP的應用的不斷增多,對于這些應用缺乏統一的標准和有效的管理,因此,PHP社區很難象PERL社區的人們那樣方便的共享彼此的代碼和應用,因爲PHP缺乏象CPAN那樣的統一的代碼庫來分類管理應用的代碼模塊(熟悉PERL的人都知道,CPAN是一個巨大的PERL的擴展模塊倉庫,編寫的應用模塊可以放在CPAN下面的適當的分類目錄下面,其他的人可以很方便地複用,當然,你編寫應用模塊時候也需要遵守其中的准則。) 爲此,PEAR就應運而生了,並且從4.04開始,隨著PHP核心一起被分發。 PEAR能給我帶來什麽好處? 1.如前所述,PEAR按照一定的分類來管理PEAR應用代碼庫,你的PEAR代碼可以組織到其中適當的目錄中,其他的人可以方便地檢索並分享到你的成果。 2.PEAR不僅僅是一個代碼倉庫,它同時也是一個標准,使用這個標准來書寫你的PHP代碼,將會增強你的程序的可讀性,複用性,減少出錯的幾率。 3.PEAR通過提供2個類爲你搭建了一個框架,實現了諸如析構函數,錯誤捕獲功能,你通過繼承就可以使用這些功能。 PEAR的編碼規則 PEAR的編碼規則包括縮進規則,控制結構,函數調用,函數定義,注釋,包含代碼,PHP標記,文件頭的注釋塊,CVS標記,URL樣例,常量的命名這11方面。下面簡要地介紹一下: 縮進規則: PEAR中需要使用4個空格來縮排代碼,並且不使用TAB。如果你使用VIM,將下列設置放入你的~/.vimrc中:set expandtab set shiftwidth=4 set tabstop=4 如果,你使用Emacs/XEmacs,需要把indent-tabs-mode 設置成nil。 不過你象我一樣喜歡用(X)Emacs編輯PHP文件,我強烈推薦你安裝PHP-MODE,這樣當你編寫PEAR代碼的時候,它會自動調整你的縮排風格,當然PHP-MODE還有許多很優秀的特性,你可以從資源列表中的地方下載最新版的PHP-MODE。 控制結構: 這裏所說的控制結構包括: if for while switch 等。對于控制結構,在關鍵字(如if for ..)後面要空一個格,然後再跟控制的圓括號,這樣,不至于和函數調用混淆,此外,你應該盡量完整的使用花括號{},即使從語法上來說是可選的。這樣可以防止你以後需添加新的代碼行時産生邏輯上的疑惑或者錯誤。這裏是一個樣例:if ((條件1) && (條件2)) { 語句1; }esleif ((條件3) || (條件4)) { 語句2; }else { 語句3; } 函數調用: 對于函數調用,函數名和左括號( 之間不應該有空格,對于函數參數,在分隔的逗號和下一個參數之間要有相同的空格分離,最後一個參數和右括號之間不能有空格。下面是一個標准的函數調用;$result = foo($param1, $param2, $param3); 不規範的寫法: $result=foo ($param1,$param2,$param3); $result=foo( $param1,$param2, $param3 ); 此外,如果要將函數的返回結果賦值,那麽在等號和所賦值的變量之間要有空格,同時,如果是一系列相關的賦值語句,你添加適當的空格,使它們對齊,就象這樣:$result1 = $foo($param1, $param2, $param3); $var2 = $foo($param3); $var3 = $foo($param4, $param5); 函數定義: 函數定義遵循"one true brace"習俗:function connect(&$dsn, $persistent = false) { if (is_array($dsn)) { $dsninfo = &&dsn; } else { $dsninfo = DB::parseDSN($dsn); } if (!$dsninfo || !$dsninfo['phptype']) { return $this->raiseError(); } return true; } 如上所示,可選參數要在參數表的末端,並且總是盡量返回有意義的函數值。 關于注釋: 對于類的在線文檔,應該能夠被PHPDoc轉換,就象JavaDoc那樣。PHPDoc也是一個PEAR的應用程序,更詳細的介紹你可以去 [url=http://www.phpdoc.de/]http://www.phpdoc.de/[/url] 查看。除了類的在線文檔,建議你應該使用非文檔性質的注釋來诠釋你的代碼,當你看到一段代碼時想:哦,我想不需要在文檔裏去仔細描述它吧。那麽你最好給這段代碼作一個簡單的注釋,這樣防止你會忘記它們是如何工作的。對于注釋的形式,C的 /* */和C++的//都不錯,不過,不要使用Perl或者shell的#注釋方式。 包含代碼: 無論什麽時候,當你需要無條件包含進一個class文件,你必須使用requre_once;當你需要條件包含進一個class文件,你必須使用include_once;這樣可以保證你要包含的文件只會包含一次,並且這2個語句共用同一個文件列表,所以你無須擔心二者會混淆,一旦require_once 包含了一個文件,include_once不會再重複包含相同的文件,反之亦然。 PHP代碼標記: 任何時候都要使用<?php ?>定義你的php代碼,而不要簡單地使用<? ?>,這樣可以保證PEAR的兼容性,也利于跨平台的移植。 文件頭的注釋聲明: 所有需要包含在PEAR核心發布的PHP代碼文件,在文件開始的時候,你必須加入以下的注釋聲明:/* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | [url=http://www.php.net/license/2_02.txt]http://www.php.net/license/2_02.txt[/url]. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [url=mailto:license@php.net]license@php.net[/url] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Original Author | // | Your Name | // +----------------------------------------------------------------------+ // // $Id$ 對于不在PEAR核心代碼庫中的文件,建議你也在文件的開始處有這樣一個類似的注釋塊,標明版權,協議,作者等等。同時也在第一行加入VIM的MODELINE,這樣在VIM中能夠保持PEAR的代碼風格。 CVS標記: 如上面所展示那樣,在每個文件中加入CVS的ID標記,如果你編輯或修改的文件中沒有這個標記,那麽請加入,或者是替換原文件中相類似的表現形式(如"Last modified"等等) URL樣本: 你可以參照RFC 2606,使用"[url=http://www.example.com]www.example.com[/url]"作爲所有的URL樣本。 常量命名: 常量應該盡量使用大寫,爲了便于理解,使用下劃線分割每個單詞。同時,你應該常量所在的包名或者是類名作爲前綴。比如,對于Bug類中常量應該以Bug_開始。以上是PEAR的編碼規則,詳細的編碼規則可以參考PEAR中的CODING_STANDDARD文件的說明。爲了更好地理解這些編碼規則,你也可以參考一下現有PEAR核心模塊的代碼。 開始使用PEAR PEAR 使用PEAR很簡單,你只需這樣定義你自己的PEAR程序:require_once "PEAR.php"; class your_class_name extends PEAR{ 你的類定義... } 當然,你需要遵守前面說的PEAR的編碼規則,之後你就可以在你的類內部實現你要做的事情了。下面,我們展開討論一下,實際上PEAR爲我們提供了2個預定義類: PEAR:這是PEAR的基類,所有的PEAR擴展都要從它繼承派生出來。 PEAR_Error:PEAR的錯誤處理的基類,你可以選擇派生出自己的錯誤處理的類。 一般來說,你不應該直接創建PEAR的實例,而是要自己派生出一個新的類,然後再創建這個新類的實例。作爲基類,PEAR給我們提供了一些有用的功能,最主要的就是析構函數和錯誤處理 析構函數 PHP支持構造函數,但是並不支持析構函數,不過,PHP提供register_shutdown_function()這個函數,從而能夠在腳本終止前回調注冊的函數,因此PEAR利用這個特性,提供了析構函數的仿真。假如你有一個PEAR的子類,叫做mypear,那麽在mypear類中,你可以定義一個函數,函數名是下劃線加上你的類名,_mypear(),這個函數就是這個類的析構函數。不過這個析構函數和C++中的析構函數不太一樣,它不會在對象被刪除的時候執行,而是在腳本結束的時候,畢竟這只是一個仿真。由于是使用了register_shutdown_function(),所以在你的析構函數裏,打印的信息將不會返回浏覽器中。此外,在你的構造函數中,需要調用一下它的父類的構造函數,因爲PHP不會自動調用父類的構造函數,而析構函數需要在PEAR的構造函數中注冊,我們可以看看PEAR的源代碼:<code> function PEAR() { if (method_exists($this, "_".get_class($this))) { global $_PEAR_destructor_object_list; $_PEAR_destructor_object_list[] = &this; } if ($this->_debug) { printf("PEAR constructor called, class=%s\n", get_class($this)); } ..... function _PEAR_call_destructors() { global $_PEAR_destructor_object_list; if (is_array($_PEAR_destructor_object_list) && sizeof($_PEAR_destructor_object_list)) { reset($_PEAR_destructor_object_list); while (list($k, $objref) = each($_PEAR_destructor_object_list)) { $destructor = "_".get_class($objref); if (method_exists($objref, $destructor)) { $objref->$destructor(); } } //清空已注冊的對象列表, //防止重複調用 $_PEAR_destructor_object_list = array(); } } .... register_shutdown_function("_PEAR_call_destructors"); </code> 上面這段代碼展示了PEAR是如何實現析構函數的,在構件函數中,將檢查當前類中是否有析構函數,如果有,那麽將把當前類的引用放入一個全局列表中,在_PEAR_call_destructors中,則檢查這個全局列表中的每個元素是否存在相應的析構函數,如果有,則調用它,最後將全局列表清空。 在PEAR.php的最後一行代碼,則調用register_shutdown_function("_PEAR_call_destructors"),注冊_PEAR_call_destructors,這樣,當腳本執行完畢的時候,PHP會回調這個函數。使用析構函數,你可以在處理完用戶的請求,退出之前做一些必要的"善後"工作,典型的例子是,你可以關閉打開的文件,斷開數據庫的連接,將某些數據存入磁盤等等。 錯誤處理 PEAR中可以讓你有很多的方式來處理錯誤,你不僅僅是簡單地返回一個錯誤代碼,或者錯誤的信息,而是可以返回一個PEAR_Error對象,或者是由PEAR_Error派生出來的新的錯誤對象。 PEAR中的錯誤對象的並沒有限定具體的輸出形式,它可以僅僅是捕獲錯誤,不給用戶返回太多的信息,也可以是去回調一個特殊錯誤處理函數,同時,即使輸出錯誤信息,它也強迫你必須要是HTML形式,你可以輸出XML,CSV形式,或者是其他你自己定義的形式,你只需要從PEAR_Error派生一個新的類,然後在適當的時候創建並"抛出"這個新類的對象就可以了。 簡單的錯誤處理: 在PEAR中,最簡單的錯誤處理是"抛出"這個錯誤,你只要簡單地創建並返回一個PEAR_Error的對象就可以了。下面是一個簡單的例子:<code> function myconnect($host = "localhost", $port = 1080) { $fp = fsockopen($host, $port, $errno, $errstr); if (!is_resource($fp)) { return new PEAR_Error($errstr, $errno); } return $fp; } $sock = myconnect(); if (PEAR::isError($sock)) { print "connect error: ".$sock->getMessage()."<BR>\n" } </code> 如上面代碼所展示的,在執行一段可能産生錯誤的代碼後,你需要使用PEAR的isError來檢測是否存在錯誤,並且可以使用PEAR_Error的getMessage來取得最近一次的錯誤信息。注意:一定要在關鍵的地方使用使用PEAR::isError 使用raiseError PHP4.0.5以後,PEAR多了2個函數: setErrorHandling($mode, $options = null) raiseError($message = null, $code = null, $mode = null,$options = null, $userinfo = null) 前者可以設置PEAR缺省的錯誤處理模式,後者是一個包裝函數,返回一個PEAR_Error的對象,和直接創建並返回PEAR_Error的對象略有不同的是,如果省略$mode,$options等參數,它會使用缺省值來創建這個PEAR_Error的對象,這些缺省值你可以使用setErrorHandling()來定制。 PEAR_Error PEAR_Error是PEAR的錯誤對象的一個基類,和PEAR不同,一般來說,你可以直接創建PEAR_Error的實例,創建方式: $error = new PEAR_Error($message, $code, $mode, $options, $userinfo); $message是你的錯誤信息,$code是該錯誤的錯誤號,後3個參數是緊密聯系的: $mode:是這個錯誤的處理模式,可以下列常量: PEAR_ERROR_RETURN:僅僅返回該錯誤對象(缺省方式) PEAR_ERROR_PRINT:在構建函數中打印這個錯誤信息,但是當前程序會繼續運行。 PEAR_ERROR_TRIGGER:使用PHP的trigger_error() 觸發一個錯誤,如果你已經設置了錯誤處理函數,或者你把PHP的錯誤處理級別設置爲E_USER_ERROR,那麽當前程序將會被終止。 PEAR_ERROR_DIE:打印錯誤並退出,程序終止。 PEAR_ERROR_CALLBACK:使用一個回調函數或者方法來處理當前錯誤,程序終止。 $options:這個參數只有在$mode是PEAR_ERROR_TRIGGER和PEAR_ERROR_CALLBACK的時候才起作用,如果是PEAR_ERROR_TRIGGER,$options必須是E_USER_NOTICE, E_USER_WARNING 或 E_USER_ERROR這3個常量的一個,同PHP中trigger_error的值一致。如果$mode是PEAR_ERROR_CALLBACK,$options可以是一個字符串,內容是要回調的函數名,也可以是一個2元素的數組,分別是一個對象變量,和一個字符串(標明要調用的方法)。 $userinfo:存放附加的用戶信息,你可以把相關的調試信息放在這裏。 PEAR_Error中有一些常用的方法,這些方法在PHP文擋沒有描述,這裏一一列出: int getMode:返回當前的錯誤處理模式,整型。 string getMessage:返回當前完整的錯誤信息,字符串。 mixed getCallback:返回當前的回調信息,可能是所回調的函數名,或者是(對象,方法)的數組。 int getCode:返回整型的錯誤代碼。 string getType:返回錯誤的類型,也就是當前的類名,字符串。 string getUserInfo:返回附加的用戶信息,字符串。 string getDebugInfo:內容同上。 string toString:返回當前對象的詳細字符串描述,內容包括錯誤處理的模式,級別,錯誤信息,錯誤代碼,相關回調函數等等。 總結 至此,對于PEAR的介紹就結束了。概括地說,如果你要做一個PEAR的擴展應用,需要這麽做: require_once "PEAR.php" 使用class your_pear_extend extends PEAR{}定義你的新類。 在你的類的構造函數中,調用父類PEAR的構造函數:function your_pear_extend{ $this->PEAR(); ... } 如果需要,定義你的析構函數 _your_pear_extend 如果需要,從PEAR_Error派生出你自己的錯誤處理類 設置你的錯誤處理模式,並在適當的時候觸發錯誤。 在執行可能産生錯誤的代碼後,用PEAR::isError($obj)捕獲相應的錯誤。 實現你自己的功能。 在最新的PHP4.05的PEAR核心發布裏,已經有不少優秀的應用模塊了,比如:PHPDoc,Cache,HTML...當然,相對于CPAN來說,PEAR只是剛剛起步,需要PHP社區的人們的共同努力,來完善它,增強它,PHP才會越來越強大。 參考資料 Pear主頁 PHP主頁 PHPDoc主頁,可以從你的PEAR應用源碼産生類似JAVADOC的API文檔 PHP-Mode for XEmacs/Emacs,爲emacs/xemacs提供php的語法支持,能夠很好支持pear代碼風格 Vim主頁,非常優秀的一個編輯器,對php的支持也很好 關于作者 潘凡(Night Sailer):北京賽迪數據有限公司工程師。主要從事是數據的分析和轉換,以及相關的開發工作。擅長使用VB,PERL,PHP進行開發以及Linux的中文化工作。近期興趣是Perl,Php與XML的應用,PHP的MVC開發模式,PERL-GTK的使用。您可以通過 E-mail:nightsailer@hotmail.com跟他聯系。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
美得讓人陶醉
杭州美女模特米萊
清純迷人唐小妹
氣質一流的上海女生
夢醉克孜加爾湖畔
珠江公園(二)
魔域桃源
南嶺森林公園親水谷
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有