任何时候都要使用<?php ?>定义你的php代码,而不要简单地使用<? ?>,这样可以保证PEAR的兼容性,也利于跨平台的移植。
所有需要包含在PEAR核心发布的PHP代码文件,在文件开始的时候,你必须加入以下的注释声明:
|
如上面所展示那样,在每个文件中加入CVS的ID标记,如果你编辑或修改的文件中没有这个标记,那么请加入,或者是替换原文件中相类似的表现形式(如"Last modified"等等)
你可以参照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中,则检查这个全
- 析构函数
