您现在的位置: 网页制作教程网 >> 网络编程 >> php 教程 >> PHP 开发技巧 >> 文章正文

PHP V5 迁移指南

作者:动态网站…

来源:动态网站制作指南

热度:

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 的返回结果十分复杂。我只需要它返回数据,但它实际上必须返回错误代码 和 数据。大多数工程师 (包括我本人在内)经常偷懒,仅返回数据,而忽略掉错误,因为错误很难管理。

上一页  [1] [2] [3] [4] [5] 下一页

我来说两句:

1分 2分 3分 4分 5分
姓名: *


* 请各位网友遵纪守法并注意语言文明。
网站简介 | 联系方式 | 意见建议 | 版权说明
Copyright © 2007 All rights reserved
滇ICP备06006992号