日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP PEAR簡介

瀏覽:14日期:2024-01-10 09:13:25

什么是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 expandtabset shiftwidth=4set 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=%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(); } } //清空已注冊的對象列表, //防止重復調用 $_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

使用raiseErrorPHP4.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_ErrorPEAR_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跟他聯系。

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩一区二区三区在线电影| 波多野结衣一区| 亚洲精品乱码久久久久久蜜桃麻豆| 免费av一区| 伊人国产精品| 国产亚洲一区二区三区不卡| 国产精品羞羞答答在线观看| 国产一区一一区高清不卡| 国产亚洲人成a在线v网站| 国产精品日韩精品在线播放 | 精品视频网站| 亚洲天堂av影院| 不卡av一区二区| 日韩成人av影视| 国产96在线亚洲| 国产麻豆综合| 香蕉久久久久久| 久久亚洲国产精品尤物| 狠狠久久婷婷| 欧美a级一区二区| 欧美影院三区| 日韩高清国产一区在线| 欧美国产免费| 亚洲欧美高清| 国模精品一区| 亚洲毛片网站| 欧美gv在线| 欧美日韩18| 亚洲精品91| 国产一区二区三区四区| 蜜桃视频第一区免费观看| 精品免费av| 日韩三级精品| 精品一区亚洲| 国产 日韩 欧美一区| 欧美日一区二区三区在线观看国产免| 日韩一区欧美| 婷婷亚洲精品| 亚洲精品电影| 国产精品伦理久久久久久| 日韩精品成人| 91久久午夜| 色88888久久久久久影院| 国产精品15p| 青青国产91久久久久久| 久久都是精品| 国产亚洲午夜| 亚洲欧洲另类| 久久久久久久久久久妇女| 国产69精品久久| 麻豆91小视频| 久久99久久人婷婷精品综合| 99视频一区| 激情婷婷欧美| 久久亚洲成人| 欧美日韩国产综合网| 亚洲婷婷在线| 国产毛片一区| 中文字幕一区二区精品区| 男女性色大片免费观看一区二区| 欧美亚洲国产一区| 亚洲精品va| 亚洲视频二区| 久久国产精品免费精品3p| 国产美女视频一区二区| 欧美激情视频一区二区三区免费 | 国产aa精品| 丰满少妇一区| 日韩精品诱惑一区?区三区| 成人羞羞在线观看网站| 在线一区免费| 亚洲精品三级| 精品国产99| 国模 一区 二区 三区| 天堂成人免费av电影一区| 日韩在线成人| 成人在线视频区| 欧美在线影院| 欧美日本一区| 久久精品官网| japanese国产精品| 日本中文字幕不卡| av在线资源| 亚洲制服一区| 久久毛片亚洲| 午夜电影一区| 久久激情一区| 欧美日韩一视频区二区| 久久精品国产99久久| 日本视频一区二区| 久久九九电影| 久久国产麻豆精品| 最新国产拍偷乱拍精品| 国产精品国产三级在线观看| 欧美精品羞羞答答| 国产麻豆精品| 国产一区白浆| 日韩一区电影| 国产精品多人| 综合日韩在线| 偷拍欧美精品| 亚洲啊v在线| 国产精品一区二区三区四区在线观看| 欧美日韩一二| 成人午夜亚洲| 国产精品蜜月aⅴ在线| 先锋影音国产一区| 欧美午夜精彩| 亚洲不卡av不卡一区二区| 国产精品久久久久久久久久妞妞| 欧美性感美女一区二区| 91亚洲国产| 欧美丰满日韩| 国产一区二区三区不卡视频网站| 日韩不卡一区二区三区| 蘑菇福利视频一区播放| av不卡在线看| 在线国产一区二区| 一区视频在线| 99pao成人国产永久免费视频| 日本久久成人网| 九九久久电影| 欧美日韩国产免费观看视频| 亚洲婷婷免费| 亚洲激情精品| 国产手机视频一区二区 | 免费国产亚洲视频| 99日韩精品| 亚洲男人在线| 欧美日韩在线精品一区二区三区激情综合| 中文字幕av一区二区三区四区| 石原莉奈一区二区三区在线观看| 香蕉久久久久久久av网站| 香蕉久久夜色精品国产| 日韩精品一级| 精品国产三区在线| 婷婷激情一区| 午夜精品亚洲| 午夜在线精品| 国产日韩中文在线中文字幕| 老色鬼精品视频在线观看播放| 亚洲精品永久免费视频| 欧美亚洲国产激情| 少妇高潮一区二区三区99| 久久久精品区| 国产精品毛片| 国产精品网在线观看| 成人小电影网站| 亚洲欧美久久久| 国产精品1区在线| 一区二区自拍| 精品免费视频| 羞羞答答国产精品www一本| 日韩精品中文字幕吗一区二区 | 综合色一区二区| 福利一区和二区| 亚洲我射av| 日韩毛片视频| 欧美影院视频| 91精品91| 国产一区二区三区亚洲综合| 视频在线在亚洲| 成人精品中文字幕| 国产欧美69| 亚洲精品国产日韩| 黄色不卡一区| 美女久久99| 亚洲精品一区二区在线播放∴| 91精品久久久久久久久久不卡| 国产精品久久久久久久久久白浆| 亚洲少妇自拍| 亚洲五月婷婷| 欧美韩日一区| 久久久久黄色| 国产精品nxnn| 日韩不卡免费视频| 亚洲欧美日韩精品一区二区 | 亚洲专区欧美专区| 丝袜美腿诱惑一区二区三区| 国产欧美日韩一级| 亚洲aa在线| 日av在线不卡| 在线亚洲自拍| 亚洲一区二区三区四区五区午夜| 一区二区三区四区日本视频| 免费视频一区二区三区在线观看 | 欧美一区成人| 亚洲精品亚洲人成在线观看| 欧美理论视频| 免费毛片在线不卡| 红桃视频国产一区| 亚洲激情社区| 一区二区三区四区精品视频| 中文字幕日韩高清在线| 久色成人在线| 日韩精品导航| 麻豆一区二区在线| 中文字幕色婷婷在线视频| 91亚洲国产| 91超碰国产精品|