|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
就是管理员可以编辑,删除,回复 等功能,。加入管理员功能要加入登陆系统,慢慢你会想在线添加管理员,慢慢你会让自己的作品更漂亮些,慢慢1个完整的留言板就会出来了,法式 PEAR简介:用PEAR来写你的下一个php法式
内容:
甚么是PEAR
为何要利用PEAR?
PEAR能给我带来甚么优点?
PEAR的编码划定规矩
入手下手利用PEAR
总结
相干资本
作者简介
潘凡(Night Sailer) (nightsailer@hotmail.com)
北京赛迪网信息手艺无限公司
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 |
// | 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,利用"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,那末在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=%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();
}
}
//清空已注册的对象列表,
//避免反复挪用
$_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
利用raiseError
PHP4.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_Error
PEAR_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的撑持也很好 php manual(PHP手册)肯定是要从网上下载一个的,它很权威,也很全面,我自己认为它是一本很好的参考书,但是不适合新手当教材使用。 |
|