首页/技术开发/内容

用PEAR来写你的下一个php程序

技术开发2024-06-13 阅读()


// +----------------------------------------------------------------------+

//

// $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=%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的支持也很好



第1页  第2页  第3页  第4页  第5页  第6页  第7页  第8页  第9页  第10页  第11页  第12页  第13页  第14页  第15页  第16页  第17页  第18页  第19页  第20页  第21页  第22页  第23页  第24页  第25页  第26页  第27页 

……

相关阅读