作者:动态网站…
来源:动态网站制作指南
热度:
2006-12-8 8:51:12
Iterator 接口使所有类都可以看似是其使用者的阵列。正如您在脚本末尾看到的那样,您可以使用 foreach 运算符重申 Configuration 对象中的所有配置项。PHP V4 没有这种功能,但您可以在应用程序中通过各种方式使用此功能。
接口机制的优点是可以将契约快速集中在一起而无须实现任何方法。最后阶段是实现接口,您必须实现所有指定的方法。PHP V5 中另一个有帮助的新功能是 抽象类,使用抽象类可以轻松地用一个基类实现接口的核心部分,然后用该接口创建实体类。
抽象类的另一个用途是为多个派生类创建一个基类,在这些派生类中,基类决不会被实例化。例如,当 DBConfiguration 和 Configuration 同时存在时,则只能使用 DBConfiguration。Configuration 类只是一个基类 —— 一个抽象类。因此,您可以使用 abstract 关键字强制该行为,如下所示。
清单 9. abstract.php5
<?php
abstract class Configuration
{
protected $_items = array();
public function __construct() {
$this->load();
}
abstract protected function load();
public function get( $key ) {
return $this->_items[ $key ];
}
}
class DBConfiguration extends Configuration
{
protected function load() {
$this->_items[ 'imgpath' ] = 'images';
}
}
$c = new DBConfiguration();
echo( $c->get( 'imgpath' )."\n" );
?>
现在,所有要将 Configuration 类型的对象实例化的尝试都会出错,因为系统认为该类是抽象的并且不完整。
静态方法和成员
PHP V5 中的另一个重要的新功能是支持对类使用静态成员和方法。通过使用这种功能,您可以使用流行的单例模式。这种模式对于 Configuration 类是十分理想的,因为应用程序应当仅有一个配置对象。
清单 10 显示了 PHP V5 版的 Configuration 类作为一个单例。
清单 10. static.php5
<?php
class Configuration
{
private $_items = array();
static private $_instance = null;
static public function get() {
if ( self::$_instance == null )
self::$_instance = new Configuration();
return self::$_instance;
}
private function __construct() {
$this->_items[ 'imgpath' ] = 'images';
}
public function __get( $key ) {
return $this->_items[ $key ];
}
}
echo( Configuration::get()->{ 'imgpath' }."\n" );
?>
static 关键字有很多用法。当需要访问单个类型的所有对象的某些全局数据时,请考虑使用此关键字。
Magic Method
PHP V5 中的另一个很大的新功能是支持 magic method,使用这些方法使对象可以迅速更改对象的接口 —— 例如,为 Configuration 对象中的每个配置项添加成员变量。无须使用 get() 方法,只要寻找一个特殊项将它当作一个阵列,如下所示。
清单 11. magic.php5
<?php
class Configuration
{
private $_items = array();
function __construct() {
$this->_items[ 'imgpath' ] = 'images';
}
function __get( $key ) {
return $this->_items[ $key ];
}
}
$c = new Configuration();
echo( $c->{ 'imgpath' }."\n" );
?>
在本例中,我创建了新的 __get() 方法,只要使用者寻找对象上的成员变量时即调用此方法。然后,方法中的代码将使用项阵列来查找值并返回该值,就像有一个专门用于该关键字的成员变量在那儿一样。假定对象就是一个阵列,在脚本的末尾,您可以看到使用 Configuration 对象就像寻找 imgpath 的值一样简单。
从 PHP V4 迁移到 PHP V5 时,必须要注意这些在 PHP V4 中完全不可用的语言特性,还必须重新验证类来查看可以怎样使用这些类。
异常
最后介绍 PHP V5 中的新异常机制来结束本文。异常为考虑错误处理提供了一种全新的方法。所有程序都不可避免地会生成错误 —— 找不到文件、内存不足等等。如果不使用异常,则必须返回错误代码。请看下面的 PHP V4 代码。
清单 12. file.php4
<?php
function parseLine( $l )
{
// ...
return array( 'error' => 0,
data => array() // data here
);
}
function readConfig( $path )
{
if ( $path == null ) return -1;
$fh = fopen( $path, 'r' );
if ( $fh == null ) return -2;
while( !feof( $fh ) ) {
$l = fgets( $fh );
$ec = parseLine( $l );
if ( $ec['error'] != 0 ) return $ec['error'];
}
fclose( $fh );
return 0;
}
$e = readConfig( 'myconfig.txt' );
if ( $e != 0 )
echo( "There was an error (".$e.")\n" );
?>
这段标准的文件 I/O 代码将读取一个文件,检索一些数据,并在遇到任何错误时返回错误代码。对于这个脚本,我有两个问题。第一个是错误代码。这些错误代码的含义是什么?要找出这些错误代码的含义,则必须创建另一个系统将这些错误代码映射到有含义的字符串中。第二个问题是 parseLine 的返回结果十分复杂。我只需要它返回数据,但它实际上必须返回错误代码 和 数据。大多数工程师 (包括我本人在内)经常偷懒,仅返回数据,而忽略掉错误,因为错误很难管理。
我来说两句:
推荐文章
相关文章