电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

用PEAR來寫你的PHP程序

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

如前所述,PEAR按照一定的分類來管理PEAR應用代碼庫,你的PEAR代碼可以組織到其中適當的目錄中,其他的人可以方便地檢索并分享到你的成果。 PEAR不僅僅是一個代碼倉庫,它同時也是一個標準,使用這個標準來書寫你的PHP代碼,將會增強你的程序的可讀性,復用性,減少出錯的幾率。 PEAR通過提供2個類為你搭建了一個框架,實現了諸如析構函數,錯誤捕獲功能,你通過繼承就可以使用這些功能。

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代碼,而不要簡單地使用,這樣可以保證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程序: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的源代碼: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');

上面這段代碼展示了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的對象就可以了。下面是一個簡單的例子: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'} 如上面代碼所展示的,在執行一段可能產生錯誤的代碼后,你需要使用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)捕獲相應的錯誤。實現你自己的功能。在PEAR核心發布里,已經有不少優秀的應用模塊了,比如:PHPDoc,Cache,HTML。

標簽: PHP
主站蜘蛛池模板: 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 防水套管厂家-柔性防水套管-不锈钢|刚性防水套管-天翔管道 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 旗帜网络笔记-免费领取《旗帜网络笔记》电子书 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 陕西鹏展科技有限公司| 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 |