六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

PEAR簡介:用PEAR來寫你的下一個php程序

[摘要]PEAR簡介:用PEAR來寫你的下一個php程序 內(nèi)容: 什么是PEAR 為什么要使用PEAR? PEAR能給我?guī)硎裁春锰帲?PEAR的編碼規(guī)則 開始使用PEAR 總結(jié) 相關(guān)資源 作者簡介 潘凡(Night Sailer) (nightsailer@hotmail.com)北京賽迪網(wǎng)信...
PEAR簡介:用PEAR來寫你的下一個php程序 

 
內(nèi)容:

什么是PEAR
為什么要使用PEAR?
PEAR能給我?guī)硎裁春锰帲?
PEAR的編碼規(guī)則
開始使用PEAR
總結(jié)
相關(guān)資源
作者簡介


潘凡(Night Sailer) (nightsailer@hotmail.com)
北京賽迪網(wǎng)信息技術(shù)有限公司
2001 年 6 月
你可能已經(jīng)是個PHP的老手了,寫了很多非常棒的代碼。但是,如果你現(xiàn)在要把它們加入到你現(xiàn)在的項目中去,是否有些吃力?你的朋友想使用你的代碼作為他的項目中的一個模塊,但是你發(fā)現(xiàn)你們使用了截然不同的編碼風(fēng)格,讓他適應(yīng),甚至不如重寫一個!
請跟我來,使用PEAR標(biāo)準(zhǔn)編寫你的PHP程序吧,你的程序?qū)䲟碛懈蟮幕盍Γ愕某绦蚝痛a將會很方便地和其他高手的代碼融合在一起,PEAR就象CPAN對于PERL一樣,會讓PHP產(chǎn)生更高的能量。
什么是PEAR
PEAR是PHP擴展與應(yīng)用庫(the PHP Extension and Application Repository)的縮寫。它是一個PHP擴展及應(yīng)用的一個代碼倉庫,簡單地說,PEAR就是PHP的CPAN。
為什么要使用PEAR?
PHP是一個非常優(yōu)秀的腳本語言,簡潔、高效,隨著4.0的發(fā)布,越來越多的人使用它來進行動態(tài)網(wǎng)站的開發(fā),可以說,PHP已經(jīng)成為最優(yōu)秀的INTERNET開發(fā)語言之一,尤其對于那些需要能夠快速、高效地開發(fā)中小規(guī)模的商業(yè)應(yīng)用的網(wǎng)站開發(fā)人員,PHP是其首選的語言。但是隨著PHP的應(yīng)用的不斷增多,對于這些應(yīng)用缺乏統(tǒng)一的標(biāo)準(zhǔn)和有效的管理,因此,PHP社區(qū)很難象PERL社區(qū)的人們那樣方便的共享彼此的代碼和應(yīng)用,因為PHP缺乏象CPAN那樣的統(tǒng)一的代碼庫來分類管理應(yīng)用的代碼模塊(熟悉PERL的人都知道,CPAN是一個巨大的PERL的擴展模塊倉庫,編寫的應(yīng)用模塊可以放在CPAN下面的適當(dāng)?shù)姆诸惸夸浵旅妫渌娜丝梢院芊奖愕貜?fù)用,當(dāng)然,你編寫應(yīng)用模塊時候也需要遵守其中的準(zhǔn)則。)
為此,PEAR就應(yīng)運而生了,并且從4.04開始,隨著PHP核心一起被分發(fā)。
PEAR能給我?guī)硎裁春锰帲?
1.如前所述,PEAR按照一定的分類來管理PEAR應(yīng)用代碼庫,你的PEAR代碼可以組織到其中適當(dāng)?shù)哪夸浿校渌娜丝梢苑奖愕貦z索并分享到你的成果。
2.PEAR不僅僅是一個代碼倉庫,它同時也是一個標(biāo)準(zhǔn),使用這個標(biāo)準(zhǔn)來書寫你的PHP代碼,將會增強你的程序的可讀性,復(fù)用性,減少出錯的幾率。
3.PEAR通過提供2個類為你搭建了一個框架,實現(xiàn)了諸如析構(gòu)函數(shù),錯誤捕獲功能,你通過繼承就可以使用這些功能。
PEAR的編碼規(guī)則
PEAR的編碼規(guī)則包括縮進規(guī)則,控制結(jié)構(gòu),函數(shù)調(diào)用,函數(shù)定義,注釋,包含代碼,PHP標(biāo)記,文件頭的注釋塊,CVS標(biāo)記,URL樣例,常量的命名這11方面。下面簡要地介紹一下:
縮進規(guī)則:
PEAR中需要使用4個空格來縮排代碼,并且不使用TAB。如果你使用VIM,將下列設(shè)置放入你的~/.vimrc中:
set expandtab
set shiftwidth=4
set tabstop=4

如果,你使用Emacs/XEmacs,需要把indent-tabs-mode 設(shè)置成nil。
不過你象我一樣喜歡用(X)Emacs編輯PHP文件,我強烈推薦你安裝PHP-MODE,這樣當(dāng)你編寫PEAR代碼的時候,它會自動調(diào)整你的縮排風(fēng)格,當(dāng)然PHP-MODE還有許多很優(yōu)秀的特性,你可以從資源列表中的地方下載最新版的PHP-MODE。
控制結(jié)構(gòu):
這里所說的控制結(jié)構(gòu)包括: if for while switch 等。對于控制結(jié)構(gòu),在關(guān)鍵字(如if for ..)后面要空一個格,然后再跟控制的圓括號,這樣,不至于和函數(shù)調(diào)用混淆,此外,你應(yīng)該盡量完整的使用花括號{},即使從語法上來說是可選的。這樣可以防止你以后需添加新的代碼行時產(chǎn)生邏輯上的疑惑或者錯誤。這里是一個樣例:
if ((條件1) && (條件2)) {
語句1;
}esleif ((條件3) (條件4)) {
語句2;
}else {
語句3;
}


函數(shù)調(diào)用:
對于函數(shù)調(diào)用,函數(shù)名和左括號( 之間不應(yīng)該有空格,對于函數(shù)參數(shù),在分隔的逗號和下一個參數(shù)之間要有相同的空格分離,最后一個參數(shù)和右括號之間不能有空格。下面是一個標(biāo)準(zhǔn)的函數(shù)調(diào)用;
$result = foo($param1, $param2, $param3);
不規(guī)范的寫法:
$result=foo ($param1,$param2,$param3);
$result=foo( $param1,$param2, $param3 );


此外,如果要將函數(shù)的返回結(jié)果賦值,那么在等號和所賦值的變量之間要有空格,同時,如果是一系列相關(guān)的賦值語句,你添加適當(dāng)?shù)目崭瘢顾鼈儗R,就象這樣:
$result1 = $foo($param1, $param2, $param3);
$var2= $foo($param3);
$var3= $foo($param4, $param5);


函數(shù)定義:
函數(shù)定義遵循"one true brace"習(xí)俗:
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;
}

如上所示,可選參數(shù)要在參數(shù)表的末端,并且總是盡量返回有意義的函數(shù)值。
關(guān)于注釋:
對于類的在線文檔,應(yīng)該能夠被PHPDoc轉(zhuǎn)換,就象JavaDoc那樣。PHPDoc也是一個PEAR的應(yīng)用程序,更詳細(xì)的介紹你可以去 http://www.phpdoc.de/ 查看。除了類的在線文檔,建議你應(yīng)該使用非文檔性質(zhì)的注釋來詮釋你的代碼,當(dāng)你看到一段代碼時想:哦,我想不需要在文檔里去仔細(xì)描述它吧。那么你最好給這段代碼作一個簡單的注釋,這樣防止你會忘記它們是如何工作的。對于注釋的形式,C的 /* */和C++的//都不錯,不過,不要使用Perl或者shell的#注釋方式。
包含代碼:
無論什么時候,當(dāng)你需要無條件包含進一個class文件,你必須使用requre_once;當(dāng)你需要條件包含進一個class文件,你必須使用include_once;這樣可以保證你要包含的文件只會包含一次,并且這2個語句共用同一個文件列表,所以你無須擔(dān)心二者會混淆,一旦require_once 包含了一個文件,include_once不會再重復(fù)包含相同的文件,反之亦然。
PHP代碼標(biāo)記:
任何時候都要使用<?php ?>定義你的php代碼,而不要簡單地使用<? ?>,這樣可以保證PEAR的兼容性,也利于跨平臺的移植。
文件頭的注釋聲明:
所有需要包含在PEAR核心發(fā)布的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核心代碼庫中的文件,建議你也在文件的開始處有這樣一個類似的注釋塊,標(biāo)明版權(quán),協(xié)議,作者等等。同時也在第一行加入VIM的MODELINE,這樣在VIM中能夠保持PEAR的代碼風(fēng)格。
CVS標(biāo)記:
如上面所展示那樣,在每個文件中加入CVS的ID標(biāo)記,如果你編輯或修改的文件中沒有這個標(biāo)記,那么請加入,或者是替換原文件中相類似的表現(xiàn)形式(如"Last modified"等等)
URL樣本:
你可以參照RFC 2606,使用"http://www.example.com"作為所有的URL樣本。
常量命名:
常量應(yīng)該盡量使用大寫,為了便于理解,使用下劃線分割每個單詞。同時,你應(yīng)該常量所在的包名或者是類名作為前綴。比如,對于Bug類中常量應(yīng)該以Bug_開始。以上是PEAR的編碼規(guī)則,詳細(xì)的編碼規(guī)則可以參考PEAR中的CODING_STANDDARD文件的說明。為了更好地理解這些編碼規(guī)則,你也可以參考一下現(xiàn)有PEAR核心模塊的代碼。
開始使用PEAR
PEAR
使用PEAR很簡單,你只需這樣定義你自己的PEAR程序:
require_once "PEAR.php";
class your_class_name extends PEAR{
你的類定義...
}


當(dāng)然,你需要遵守前面說的PEAR的編碼規(guī)則,之后你就可以在你的類內(nèi)部實現(xiàn)你要做的事情了。下面,我們展開討論一下,實際上PEAR為我們提供了2個預(yù)定義類:
PEAR:這是PEAR的基類,所有的PEAR擴展都要從它繼承派生出來。
PEAR_Error:PEAR的錯誤處理的基類,你可以選擇派生出自己的錯誤處理的類。
一般來說,你不應(yīng)該直接創(chuàng)建PEAR的實例,而是要自己派生出一個新的類,然后再創(chuàng)建這個新類的實例。作為基類,PEAR給我們提供了一些有用的功能,最主要的就是析構(gòu)函數(shù)和錯誤處理
析構(gòu)函數(shù)
PHP支持構(gòu)造函數(shù),但是并不支持析構(gòu)函數(shù),不過,PHP提供register_shutdown_function()這個函數(shù),從而能夠在腳本終止前回調(diào)注冊的函數(shù),因此PEAR利用這個特性,提供了析構(gòu)函數(shù)的仿真。假如你有一個PEAR的子類,叫做mypear,那么在mypear類中,你可以定義一個函數(shù),函數(shù)名是下劃線加上你的類名,_mypear(),這個函數(shù)就是這個類的析構(gòu)函數(shù)。不過這個析構(gòu)函數(shù)和C++中的析構(gòu)函數(shù)不太一樣,它不會在對象被刪除的時候執(zhí)行,而是在腳本結(jié)束的時候,畢竟這只是一個仿真。由于是使用了register_shutdown_function(),所以在你的析構(gòu)函數(shù)里,打印的信息將不會返回瀏覽器中。此外,在你的構(gòu)造函數(shù)中,需要調(diào)用一下它的父類的構(gòu)造函數(shù),因為PHP不會自動調(diào)用父類的構(gòu)造函數(shù),而析構(gòu)函數(shù)需要在PEAR的構(gòu)造函數(shù)中注冊,我們可以看看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();
}
}
//清空已注冊的對象列表,
//防止重復(fù)調(diào)用
$_PEAR_destructor_object_list = array();
}
}
....
register_shutdown_function("_PEAR_call_destructors");
</code>


上面這段代碼展示了PEAR是如何實現(xiàn)析構(gòu)函數(shù)的,在構(gòu)件函數(shù)中,將檢查當(dāng)前類中是否有析構(gòu)函數(shù),如果有,那么將把當(dāng)前類的引用放入一個全局列表中,在_PEAR_call_destructors中,則檢查這個全局列表中的每個元素是否存在相應(yīng)的析構(gòu)函數(shù),如果有,則調(diào)用它,最后將全局列表清空。
在PEAR.php的最后一行代碼,則調(diào)用register_shutdown_function("_PEAR_call_destructors"),注冊_PEAR_call_destructors,這樣,當(dāng)腳本執(zhí)行完畢的時候,PHP會回調(diào)這個函數(shù)。使用析構(gòu)函數(shù),你可以在處理完用戶的請求,退出之前做一些必要的"善后"工作,典型的例子是,你可以關(guān)閉打開的文件,斷開數(shù)據(jù)庫的連接,將某些數(shù)據(jù)存入磁盤等等。
錯誤處理
PEAR中可以讓你有很多的方式來處理錯誤,你不僅僅是簡單地返回一個錯誤代碼,或者錯誤的信息,而是可以返回一個PEAR_Error對象,或者是由PEAR_Error派生出來的新的錯誤對象。
PEAR中的錯誤對象的并沒有限定具體的輸出形式,它可以僅僅是捕獲錯誤,不給用戶返回太多的信息,也可以是去回調(diào)一個特殊錯誤處理函數(shù),同時,即使輸出錯誤信息,它也強迫你必須要是HTML形式,你可以輸出XML,CSV形式,或者是其他你自己定義的形式,你只需要從PEAR_Error派生一個新的類,然后在適當(dāng)?shù)臅r候創(chuàng)建并"拋出"這個新類的對象就可以了。
簡單的錯誤處理:
在PEAR中,最簡單的錯誤處理是"拋出"這個錯誤,你只要簡單地創(chuàng)建并返回一個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>

如上面代碼所展示的,在執(zhí)行一段可能產(chǎn)生錯誤的代碼后,你需要使用PEAR的isError來檢測是否存在錯誤,并且可以使用PEAR_Error的getMessage來取得最近一次的錯誤信息。注意:一定要在關(guān)鍵的地方使用使用PEAR::isError
使用raiseError
PHP4.0.5以后,PEAR多了2個函數(shù):
setErrorHandling($mode, $options = null)
raiseError($message = null, $code = null, $mode = null,$options = null, $userinfo = null)

前者可以設(shè)置PEAR缺省的錯誤處理模式,后者是一個包裝函數(shù),返回一個PEAR_Error的對象,和直接創(chuàng)建并返回PEAR_Error的對象略有不同的是,如果省略$mode,$options等參數(shù),它會使用缺省值來創(chuàng)建這個PEAR_Error的對象,這些缺省值你可以使用setErrorHandling()來定制。
PEAR_Error
PEAR_Error是PEAR的錯誤對象的一個基類,和PEAR不同,一般來說,你可以直接創(chuàng)建PEAR_Error的實例,創(chuàng)建方式:
$error = new PEAR_Error($message, $code, $mode, $options, $userinfo);
$message是你的錯誤信息,$code是該錯誤的錯誤號,后3個參數(shù)是緊密聯(lián)系的:
$mode:是這個錯誤的處理模式,可以下列常量:
PEAR_ERROR_RETURN:僅僅返回該錯誤對象(缺省方式)
PEAR_ERROR_PRINT:在構(gòu)建函數(shù)中打印這個錯誤信息,但是當(dāng)前程序會繼續(xù)運行。
PEAR_ERROR_TRIGGER:使用PHP的trigger_error() 觸發(fā)一個錯誤,如果你已經(jīng)設(shè)置了錯誤處理函數(shù),或者你把PHP的錯誤處理級別設(shè)置為E_USER_ERROR,那么當(dāng)前程序?qū)唤K止。
PEAR_ERROR_DIE:打印錯誤并退出,程序終止。
PEAR_ERROR_CALLBACK:使用一個回調(diào)函數(shù)或者方法來處理當(dāng)前錯誤,程序終止。
$options:這個參數(shù)只有在$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可以是一個字符串,內(nèi)容是要回調(diào)的函數(shù)名,也可以是一個2元素的數(shù)組,分別是一個對象變量,和一個字符串(標(biāo)明要調(diào)用的方法)。
$userinfo:存放附加的用戶信息,你可以把相關(guān)的調(diào)試信息放在這里。
PEAR_Error中有一些常用的方法,這些方法在PHP文擋沒有描述,這里一一列出:
int getMode:返回當(dāng)前的錯誤處理模式,整型。
string getMessage:返回當(dāng)前完整的錯誤信息,字符串。
mixed getCallback:返回當(dāng)前的回調(diào)信息,可能是所回調(diào)的函數(shù)名,或者是(對象,方法)的數(shù)組。
int getCode:返回整型的錯誤代碼。
string getType:返回錯誤的類型,也就是當(dāng)前的類名,字符串。
string getUserInfo:返回附加的用戶信息,字符串。
string getDebugInfo:內(nèi)容同上。
string toString:返回當(dāng)前對象的詳細(xì)字符串描述,內(nèi)容包括錯誤處理的模式,級別,錯誤信息,錯誤代碼,相關(guān)回調(diào)函數(shù)等等。
總結(jié)
至此,對于PEAR的介紹就結(jié)束了。概括地說,如果你要做一個PEAR的擴展應(yīng)用,需要這么做:
require_once "PEAR.php"
使用class your_pear_extend extends PEAR{}定義你的新類。
在你的類的構(gòu)造函數(shù)中,調(diào)用父類PEAR的構(gòu)造函數(shù):
function your_pear_extend{
$this->PEAR();
...
}

如果需要,定義你的析構(gòu)函數(shù) _your_pear_extend
如果需要,從PEAR_Error派生出你自己的錯誤處理類
設(shè)置你的錯誤處理模式,并在適當(dāng)?shù)臅r候觸發(fā)錯誤。
在執(zhí)行可能產(chǎn)生錯誤的代碼后,用PEAR::isError($obj)捕獲相應(yīng)的錯誤。
實現(xiàn)你自己的功能。
在最新的PHP4.05的PEAR核心發(fā)布里,已經(jīng)有不少優(yōu)秀的應(yīng)用模塊了,比如:PHPDoc,Cache,HTML...當(dāng)然,相對于CPAN來說,PEAR只是剛剛起步,需要PHP社區(qū)的人們的共同努力,來完善它,增強它,PHP才會越來越強大。
相關(guān)資源
Pear主頁
PHP主頁
PHPDoc主頁,可以從你的PEAR應(yīng)用源碼產(chǎn)生類似JAVADOC的API文檔
PHP-Mode for XEmacs/Emacs,為emacs/xemacs提供php的語法支持,能夠很好支持pear代碼風(fēng)格
Vim主頁,非常優(yōu)秀的一個編輯器,對php的支持也很好


主站蜘蛛池模板: 午夜国产精品免费观看 | 日本高清一区二区三区不卡免费 | 亚洲第一中文 | 日本优女 | 午夜影院在线免费观看 | 亚洲第一色视频 | 亚洲 另类 在线 欧美 制服 | 天天拍天天干 | 色六月婷婷 | 欧美一级大片在线观看 | 亚洲视频欧美视频 | 污在线观看视频 | 天天干天天拍天天射天天添天天爱 | 青青草一区国产97 | 青娱乐在线国产 | 中文字幕一区婷婷久久 | 亚洲精品第一页 | 亚洲伊人成综合人影院小说 | 午夜影视体验区 | 午夜精品福利视频 | 亚州黄网| 午夜免费福利影院 | 色天天综合色天天天天看大 | 青草免费在线 | 青草视频在线免费观看 | 亚洲欧美日韩一区高清中文字幕 | 亚洲资源最新版在线观看 | 香蕉久久夜色精品国产小说 | 欧美视频一级 | 日本高清天码一区在线播放 | 人人免费人人专区 | 性欧美大战久久久久久久野外 | 手机在线成人精品视频网 | 日韩中文字幕久久精品 | 伊人精品久久久大香线蕉99 | 亚洲 欧美 国产另类首页 | 天天艹夜夜艹 | 亚洲狠狠操 | 亚洲 自拍 中文字幕 在线 | 亚洲成色www久久网站 | 青青草原在线免费观看 |