分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程PHP专区 → 文章内容

用PEAR来写你的下一个php程序(潘凡Night Sailer)(2)

  • 作者:佚名    来源:不详    发布时间:2006-2-26 1:58:46
  • 字体大小:
文件头的注释声明 

所有需要包含在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_ErrorPEAR的错误处理的基类你可以选择派生出自己的错误处理的类。



一般来说
你不应该直接创建PEAR的实例而是要自己派生出一个新的类然后再创建这个新类

的实例。作为基类
PEAR给我们提供了一些有用的功能最主要的就是析构函数和错误处理



析构函数

PHP支持构造函数
但是并不支持析构函数不过PHP提供register_shutdown_function()这个

函数
从而能够在脚本终止前回调注册的函数因此PEAR利用这个特性提供了析构函数的仿

真。假如你有一个PEAR的子类
叫做mypear,那么在mypear类中你可以定义一个函数函数名是

下划线加上你的类名
_mypear(),这个函数就是这个类的析构函数。不过这个析构函数和C++中的

析构函数不太一样
它不会在对象被删除的时候执行而是在脚本结束的时候毕竟这只是一个

仿真。由于是使用了register_shutdown_function
()所以在你的析构函数里打印的信息将不

会返回浏览器中。此外
在你的构造函数中需要调用一下它的父类的构造函数因为PHP不会自

动调用父类的构造函数
而析构函数需要在PEAR的构造函数中注册我们可以看看PEAR的源代

 

<code>

function PEAR() 

if ($this->_debug)     

.....

function _PEAR_call_destructors() 

    }

    //清空已注册的对象列表



    //防止重复调用



    $_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形式
你可以输出XMLCSV形式或者是其他你自己定义的形式你只需要从PEAR_Error派

生一个新的类
然后在适当的时候创建并"抛出"这个新类的对象就可以了。



简单的错误处理
 

在PEAR中最简单的错误处理是"抛出"这个错误你只要简单地创建并返回一个PEAR_Error的对

象就可以了。下面是一个简单的例子
 

<code>

function myconnect($host = "localhost", $port = 1080)



    return $fp;

}



$sock = myconnect();

if (PEAR::isError($sock)) 

</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的扩展应用需要这么做



1.require_once "PEAR.php" 

2.使用class your_pear_extend extends PEAR{}定义你的新类。 

3.在你的类的构造函数中调用父类PEAR的构造函数 

function your_pear_extend



 



4.如果需要定义你的析构函数 _your_pear_extend 

5.如果需要从PEAR_Error派生出你自己的错误处理类 

6.设置你的错误处理模式并在适当的时候触发错误。 

7.在执行可能产生错误的代码后用PEAR::isError($obj)捕获相应的错误。 

8.实现你自己的功能。



在最新的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
PERLPHP进行开发以及Linux的中文化工作。近期兴趣是Perl,Php与

XML的应用
PHP的MVC开发模式PERL-GTK的使用。您可以通过 E-

mail:nightsailer@hotmail.com跟他联系。  
<