国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

用PEAR來寫你的PHP程序

瀏覽:42日期:2024-02-23 09:08:43

如前所述,PEAR按照一定的分類來管理PEAR應(yīng)用代碼庫,你的PEAR代碼可以組織到其中適當(dāng)?shù)哪夸浿校渌娜丝梢苑奖愕貦z索并分享到你的成果。 PEAR不僅僅是一個(gè)代碼倉庫,它同時(shí)也是一個(gè)標(biāo)準(zhǔn),使用這個(gè)標(biāo)準(zhǔn)來書寫你的PHP代碼,將會(huì)增強(qiáng)你的程序的可讀性,復(fù)用性,減少出錯(cuò)的幾率。 PEAR通過提供2個(gè)類為你搭建了一個(gè)框架,實(shí)現(xiàn)了諸如析構(gòu)函數(shù),錯(cuò)誤捕獲功能,你通過繼承就可以使用這些功能。

PEAR的編碼規(guī)則包括縮進(jìn)規(guī)則,控制結(jié)構(gòu),函數(shù)調(diào)用,函數(shù)定義,注釋,包含代碼,PHP標(biāo)記,文件頭的注釋塊,CVS標(biāo)記,URL樣例,常量的命名這11方面。下面簡(jiǎn)要地介紹一下:

縮進(jìn)規(guī)則:PEAR中需要使用4個(gè)空格來縮排代碼,并且不使用TAB。如果你使用VIM,將下列設(shè)置放入你的~/.vimrc中:set expandtabset shiftwidth=4set tabstop=4 如果,你使用Emacs/XEmacs,需要把indent-tabs-mode 設(shè)置成nil。

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

控制結(jié)構(gòu):這里所說的控制結(jié)構(gòu)包括: if for while switch 等。對(duì)于控制結(jié)構(gòu),在關(guān)鍵字(如if for ..)后面要空一個(gè)格,然后再跟控制的圓括號(hào),這樣,不至于和函數(shù)調(diào)用混淆,此外,你應(yīng)該盡量完整的使用花括號(hào){},即使從語法上來說是可選的。這樣可以防止你以后需添加新的代碼行時(shí)產(chǎn)生邏輯上的疑惑或者錯(cuò)誤。這里是一個(gè)樣例:if ((條件1) && (條件2)) { 語句1;}esleif ((條件3) || (條件4)) { 語句2;}else { 語句3;}

函數(shù)調(diào)用:對(duì)于函數(shù)調(diào)用,函數(shù)名和左括號(hào)( 之間不應(yīng)該有空格,對(duì)于函數(shù)參數(shù),在分隔的逗號(hào)和下一個(gè)參數(shù)之間要有相同的空格分離,最后一個(gè)參數(shù)和右括號(hào)之間不能有空格。下面是一個(gè)標(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é)果賦值,那么在等號(hào)和所賦值的變量之間要有空格,同時(shí),如果是一系列相關(guān)的賦值語句,你添加適當(dāng)?shù)目崭瘢顾鼈儗?duì)齊,就象這樣:$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)于注釋:對(duì)于類的在線文檔,應(yīng)該能夠被PHPDoc轉(zhuǎn)換,就象JavaDoc那樣。PHPDoc也是一個(gè)PEAR的應(yīng)用程序,更詳細(xì)的介紹你可以去 http://www.phpdoc.de/ 查看。除了類的在線文檔,建議你應(yīng)該使用非文檔性質(zhì)的注釋來詮釋你的代碼,當(dāng)你看到一段代碼時(shí)想:哦,我想不需要在文檔里去仔細(xì)描述它吧。那么你最好給這段代碼作一個(gè)簡(jiǎn)單的注釋,這樣防止你會(huì)忘記它們是如何工作的。對(duì)于注釋的形式,C的 /* */和C++的//都不錯(cuò),不過,不要使用Perl或者shell的#注釋方式。

包含代碼:無論什么時(shí)候,當(dāng)你需要無條件包含進(jìn)一個(gè)class文件,你必須使用requre_once;當(dāng)你需要條件包含進(jìn)一個(gè)class文件,你必須使用 include_once;這樣可以保證你要包含的文件只會(huì)包含一次,并且這2個(gè)語句共用同一個(gè)文件列表,所以你無須擔(dān)心二者會(huì)混淆,一旦 require_once 包含了一個(gè)文件,include_once不會(huì)再重復(fù)包含相同的文件,反之亦然。

PHP代碼標(biāo)記:任何時(shí)候都要使用定義你的php代碼,而不要簡(jiǎn)單地使用,這樣可以保證PEAR的兼容性,也利于跨平臺(tái)的移植。

文件頭的注釋聲明:所有需要包含在PEAR核心發(fā)布的PHP代碼文件,在文件開始的時(shí)候,你必須加入以下的注釋聲明:/* 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] so we can mail you a copy immediately.;;;;|// +----------------------------------------------------------------------+// | Authors: Original Author |// |; Your Name; |// +----------------------------------------------------------------------+//// $Id$ 對(duì)于不在PEAR核心代碼庫中的文件,建議你也在文件的開始處有這樣一個(gè)類似的注釋塊,標(biāo)明版權(quán),協(xié)議,作者等等。同時(shí)也在第一行加入VIM的MODELINE,這樣在VIM中能夠保持PEAR的代碼風(fēng)格。

CVS標(biāo)記:如上面所展示那樣,在每個(gè)文件中加入CVS的ID標(biāo)記,如果你編輯或修改的文件中沒有這個(gè)標(biāo)記,那么請(qǐng)加入,或者是替換原文件中相類似的表現(xiàn)形式(如'Last modified'等等)

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

常量命名:常量應(yīng)該盡量使用大寫,為了便于理解,使用下劃線分割每個(gè)單詞。同時(shí),你應(yīng)該常量所在的包名或者是類名作為前綴。比如,對(duì)于Bug類中常量應(yīng)該以Bug_開始。以上是PEAR的編碼規(guī)則,詳細(xì)的編碼規(guī)則可以參考PEAR中的CODING_STANDDARD文件的說明。為了更好地理解這些編碼規(guī)則,你也可以參考一下現(xiàn)有PEAR核心模塊的代碼。

開始使用PEAR

使用PEAR很簡(jiǎn)單,你只需這樣定義你自己的PEAR程序:require_once 'PEAR.php';class your_class_name extends PEAR{你的類定義...}

當(dāng)然,你需要遵守前面說的PEAR的編碼規(guī)則,之后你就可以在你的類內(nèi)部實(shí)現(xiàn)你要做的事情了。下面,我們展開討論一下,實(shí)際上PEAR為我們提供了2個(gè)預(yù)定義類: PEAR:這是PEAR的基類,所有的PEAR擴(kuò)展都要從它繼承派生出來。 PEAR_Error:PEAR的錯(cuò)誤處理的基類,你可以選擇派生出自己的錯(cuò)誤處理的類。

一般來說,你不應(yīng)該直接創(chuàng)建PEAR的實(shí)例,而是要自己派生出一個(gè)新的類,然后再創(chuàng)建這個(gè)新類的實(shí)例。作為基類,PEAR給我們提供了一些有用的功能,最主要的就是析構(gòu)函數(shù)和錯(cuò)誤處理

析構(gòu)函數(shù)PHP 支持構(gòu)造函數(shù),但是并不支持析構(gòu)函數(shù),不過,PHP提供register_shutdown_function()這個(gè)函數(shù),從而能夠在腳本終止前回調(diào)注冊(cè)的函數(shù),因此PEAR利用這個(gè)特性,提供了析構(gòu)函數(shù)的仿真。假如你有一個(gè)PEAR的子類,叫做mypear,那么在mypear類中,你可以定義一個(gè)函數(shù),函數(shù)名是下劃線加上你的類名,_mypear(),這個(gè)函數(shù)就是這個(gè)類的析構(gòu)函數(shù)。不過這個(gè)析構(gòu)函數(shù)和C++中的析構(gòu)函數(shù)不太一樣,它不會(huì)在對(duì)象被刪除的時(shí)候執(zhí)行,而是在腳本結(jié)束的時(shí)候,畢竟這只是一個(gè)仿真。由于是使用了register_shutdown_function(),所以在你的析構(gòu)函數(shù)里,打印的信息將不會(huì)返回瀏覽器中。此外,在你的構(gòu)造函數(shù)中,需要調(diào)用一下它的父類的構(gòu)造函數(shù),因?yàn)镻HP不會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù),而析構(gòu)函數(shù)需要在 PEAR的構(gòu)造函數(shù)中注冊(cè),我們可以看看PEAR的源代碼: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=%sn', 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(); } } //清空已注冊(cè)的對(duì)象列表, //防止重復(fù)調(diào)用 $_PEAR_destructor_object_list = array(); }}....register_shutdown_function('_PEAR_call_destructors');

上面這段代碼展示了PEAR是如何實(shí)現(xiàn)析構(gòu)函數(shù)的,在構(gòu)件函數(shù)中,將檢查當(dāng)前類中是否有析構(gòu)函數(shù),如果有,那么將把當(dāng)前類的引用放入一個(gè)全局列表中,在 _PEAR_call_destructors中,則檢查這個(gè)全局列表中的每個(gè)元素是否存在相應(yīng)的析構(gòu)函數(shù),如果有,則調(diào)用它,最后將全局列表清空。

在PEAR.php 的最后一行代碼,則調(diào)用register_shutdown_function('_PEAR_call_destructors'),注冊(cè) _PEAR_call_destructors,這樣,當(dāng)腳本執(zhí)行完畢的時(shí)候,PHP會(huì)回調(diào)這個(gè)函數(shù)。使用析構(gòu)函數(shù),你可以在處理完用戶的請(qǐng)求,退出之前做一些必要的'善后'工作,典型的例子是,你可以關(guān)閉打開的文件,斷開數(shù)據(jù)庫的連接,將某些數(shù)據(jù)存入磁盤等等。

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

PEAR 中的錯(cuò)誤對(duì)象的并沒有限定具體的輸出形式,它可以僅僅是捕獲錯(cuò)誤,不給用戶返回太多的信息,也可以是去回調(diào)一個(gè)特殊錯(cuò)誤處理函數(shù),同時(shí),即使輸出錯(cuò)誤信息,它也強(qiáng)迫你必須要是HTML形式,你可以輸出XML,CSV形式,或者是其他你自己定義的形式,你只需要從PEAR_Error派生一個(gè)新的類,然后在適當(dāng)?shù)臅r(shí)候創(chuàng)建并'拋出'這個(gè)新類的對(duì)象就可以了。

簡(jiǎn)單的錯(cuò)誤處理:在PEAR中,最簡(jiǎn)單的錯(cuò)誤處理是'拋出'這個(gè)錯(cuò)誤,你只要簡(jiǎn)單地創(chuàng)建并返回一個(gè)PEAR_Error的對(duì)象就可以了。下面是一個(gè)簡(jiǎn)單的例子: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().'n'} 如上面代碼所展示的,在執(zhí)行一段可能產(chǎn)生錯(cuò)誤的代碼后,你需要使用PEAR的isError來檢測(cè)是否存在錯(cuò)誤,并且可以使用PEAR_Error的getMessage來取得最近一次的錯(cuò)誤信息。注意:一定要在關(guān)鍵的地方使用使用PEAR::isError

使用raiseErrorPHP4.0.5以后,PEAR多了2個(gè)函數(shù):setErrorHandling($mode, $options = null)raiseError($message = null, $code = null, $mode = null,$options = null, $userinfo = null) 前者可以設(shè)置PEAR缺省的錯(cuò)誤處理模式,后者是一個(gè)包裝函數(shù),返回一個(gè)PEAR_Error的對(duì)象,和直接創(chuàng)建并返回PEAR_Error的對(duì)象略有不同的是,如果省略$mode,$options等參數(shù),它會(huì)使用缺省值來創(chuàng)建這個(gè)PEAR_Error的對(duì)象,這些缺省值你可以使用 setErrorHandling()來定制。

PEAR_ErrorPEAR_Error 是PEAR的錯(cuò)誤對(duì)象的一個(gè)基類,和PEAR不同,一般來說,你可以直接創(chuàng)建PEAR_Error的實(shí)例,創(chuàng)建方式: $error = new PEAR_Error($message, $code, $mode, $options, $userinfo);

$message是你的錯(cuò)誤信息,$code是該錯(cuò)誤的錯(cuò)誤號(hào),后3個(gè)參數(shù)是緊密聯(lián)系的:$mode:是這個(gè)錯(cuò)誤的處理模式,可以下列常量:PEAR_ERROR_RETURN:僅僅返回該錯(cuò)誤對(duì)象(缺省方式)PEAR_ERROR_PRINT:在構(gòu)建函數(shù)中打印這個(gè)錯(cuò)誤信息,但是當(dāng)前程序會(huì)繼續(xù)運(yùn)行。PEAR_ERROR_TRIGGER:使用PHP的trigger_error() 觸發(fā)一個(gè)錯(cuò)誤,如果你已經(jīng)設(shè)置了錯(cuò)誤處理函數(shù),或者你把PHP的錯(cuò)誤處理級(jí)別設(shè)置為E_USER_ERROR,那么當(dāng)前程序?qū)?huì)被終止。PEAR_ERROR_DIE:打印錯(cuò)誤并退出,程序終止。PEAR_ERROR_CALLBACK:使用一個(gè)回調(diào)函數(shù)或者方法來處理當(dāng)前錯(cuò)誤,程序終止。$options:這個(gè)參數(shù)只有在$mode是PEAR_ERROR_TRIGGER和PEAR_ERROR_CALLBACK的時(shí)候才起作用,如果是 PEAR_ERROR_TRIGGER,$options必須是E_USER_NOTICE, E_USER_WARNING 或 E_USER_ERROR這3個(gè)常量的一個(gè),同PHP中trigger_error的值一致。如果$mode是PEAR_ERROR_CALLBACK, $options可以是一個(gè)字符串,內(nèi)容是要回調(diào)的函數(shù)名,也可以是一個(gè)2元素的數(shù)組,分別是一個(gè)對(duì)象變量,和一個(gè)字符串(標(biāo)明要調(diào)用的方法)。$userinfo:存放附加的用戶信息,你可以把相關(guān)的調(diào)試信息放在這里。

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

int getMode:返回當(dāng)前的錯(cuò)誤處理模式,整型。string getMessage:返回當(dāng)前完整的錯(cuò)誤信息,字符串。mixed getCallback:返回當(dāng)前的回調(diào)信息,可能是所回調(diào)的函數(shù)名,或者是(對(duì)象,方法)的數(shù)組。int getCode:返回整型的錯(cuò)誤代碼。string getType:返回錯(cuò)誤的類型,也就是當(dāng)前的類名,字符串。string getUserInfo:返回附加的用戶信息,字符串。string getDebugInfo:內(nèi)容同上。string toString:返回當(dāng)前對(duì)象的詳細(xì)字符串描述,內(nèi)容包括錯(cuò)誤處理的模式,級(jí)別,錯(cuò)誤信息,錯(cuò)誤代碼,相關(guān)回調(diào)函數(shù)等等。

總結(jié)

至此,對(duì)于PEAR的介紹就結(jié)束了。概括地說,如果你要做一個(gè)PEAR的擴(kuò)展應(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派生出你自己的錯(cuò)誤處理類設(shè)置你的錯(cuò)誤處理模式,并在適當(dāng)?shù)臅r(shí)候觸發(fā)錯(cuò)誤。在執(zhí)行可能產(chǎn)生錯(cuò)誤的代碼后,用PEAR::isError($obj)捕獲相應(yīng)的錯(cuò)誤。實(shí)現(xiàn)你自己的功能。在PEAR核心發(fā)布里,已經(jīng)有不少優(yōu)秀的應(yīng)用模塊了,比如:PHPDoc,Cache,HTML。

標(biāo)簽: PHP
主站蜘蛛池模板: 美女视频黄视大全视频免费网址 | 欧美国产在线观看 | 国产精品一区二区久久精品 | 91免费国产精品 | 最近中文字幕精彩视频 | 国产亚洲精品久久 | 精品久久久久不卡无毒 | 男人的天堂在线观看入口 | 亚洲第一在线 | 天天都色| 国产欧美自拍 | 国产深夜福利视频网站在线观看 | 亚洲国产第一区二区三区 | 亚洲国产精品一区二区久久 | 99精品国产高清一区二区三区香蕉 | 免费国产不卡午夜福在线 | 99久久免费精品 | 亚洲高清中文字幕一区二区三区 | 久久精品中文字幕一区 | 亚洲欧美天堂 | 天堂视频免费看 | 国产亚洲精品久久麻豆 | 一区二区中文字幕亚洲精品 | 久久精品视频16 | 久久免费视频观看 | 毛片一区| 中文字幕免费视频 | 亚洲欧美自拍一区 | 日韩毛片久久91 | 大陆孕妇孕交视频自拍 | 91精品视频播放 | 黄色毛片视频网站 | 末满18以下勿进色禁网站 | 国内精品伊人久久 | 男人女人做刺激视频免费 | 高清国产露脸捆绑01经典 | 欧美aaa视频 | 亚洲国产成人久久精品影视 | 国产手机在线小视频免费观看 | 国产成人亚洲合集青青草原精品 | 亚洲加勒比在线 |