pear簡介:用pear來寫你的下一個php程序
內容:
什麼是pear
為什麼要使用pear?
pear能給我帶來什麼好處?
pear的編碼規則
開始使用pear
總結
相關資源
作者簡介
潘凡(night sailer) ([email protected])
北京賽迪網信息技術有限公司
2001 年 6 月
你可能已經是個php的老手了,寫了很多非常棒的代碼。但是,如果你現在要把它們加入到你現在的項目中去,是否有些吃力?你的朋友想使用你的代碼作為他的項目中的一個模塊,但是你發現你們使用了截然不同的編碼風格,讓他適應,甚至不如重寫一個!
請跟我來,使用pear標准編寫你的php程序吧,你的程序將會擁有更大的活力,你的程序和代碼將會很方便地和其他高手的代碼融合在一起,pear就象cpan對於perl一樣,會讓php產生更高的能量。
什麼是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 |
// |[email protected] 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,使用"http://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,那麼在mype