手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Php编程>列表

PHP V5 迁移指南

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


清单 5. access4.php5

<?php
class Configuration
{
private $_items = array();

public function __construct() {
$this->load();
}
protected function load() { }
protected function add( $key, $value ) {
$this->_items[ $key ] = $value;
}
public function get( $key ) {
return $this->_items[ $key ];
}
}

class DBConfiguration extends Configuration
{
protected function load() {
$this->add( 'imgpath', 'images' );
}
}

$c = new DBConfiguration();
echo( $c->get( 'imgpath' )."\n" );
?>


现在,项阵列可以是 private 的,因为子类使用受保护的 add() 方法将配置项添加到列表中。Configuration 类可以更改存储和读取配置项的方法而不需要考虑它的子类。只要 load() 和 add() 方法以同样的方法运行,子类就应当不会出问题。

对于我来说,增加了访问控制是考虑移至 PHP V5 的主要原因。难道就因为 Grady Booch 说 PHP V5 是四大面向对象的语言之一么?不,因为我曾经接受了一个任务来维护 100KLOC C 代码,在这些代码中所有方法和成员都被定义为 public 的。我花了三天时间来清除这些定义,并在清除过程中,明显地减少了错误数并提高了可维护性。为什么?因为没有访问控制,就不可能知道对象怎样使用其他对象,也就不可能在不知道要突破什么难关的情况下做任何更改。使用 C ,至少我还有编译程序可用。PHP 没有配备编译程序,因此这类访问控制变得愈加重要。

契约编程

从 PHP V4 迁移到 PHP V5 时要利用的下一个重要特性是支持通过接口、抽象类和方法进行契约编程。清单 6 显示了一个版本的 Configuration 类,在该类中 PHP V4 编码人员尝试了构建基本接口而根本不使用 interface 关键字。


清单 6. interface.php4

<?php
class IConfiguration
{
function get( $key ) { }
}

class Configuration extends IConfiguration
{
var $_items = array();

function Configuration() {
$this->load();
}
function load() { }
function get( $key ) {
return $this->_items[ $key ];
}
}

class DBConfiguration extends Configuration
{
function load() {
$this->_items[ 'imgpath' ] = 'images';
}
}

$c = new DBConfiguration();
echo( $c->get( 'imgpath' )."\n" );
?>


清单开始于一个小型 IConfiguration 类,该类定义所有 Configuration 类或派生类所提供的接口。此接口将在类与其所有使用者之间定义契约。契约声明了实现 IConfiguration 的所有类必须配有 get() 方法并且 IConfiguration 的所有使用者都必须坚持仅使用 get() 方法。

下面的这段代码是在 PHP V5 中运行的,但最好使用提供的接口系统,如下所示。


清单 7. interface1.php5

<?php
interface IConfiguration
{
function get( $key );
}

class Configuration implements IConfiguration
{
...
}

class DBConfiguration extends Configuration
{
...
}

$c = new DBConfiguration();
echo( $c->get( 'imgpath' )."\n" );
?>


一方面,读者可以更清楚地了解运行状况;另一方面,单个类可以实现多个接口。清单 8 显示了如何扩展 Configuration 类来实现 Iterator 接口,对于 PHP 来说,该接口是内部接口。


清单 8. interface2.php5

<?php
interface IConfiguration {
...
}

class Configuration implements IConfiguration, Iterator
{
private $_items = array();

public function __construct() {
$this->load();
}
protected function load() { }
protected function add( $key, $value ) {
$this->_items[ $key ] = $value;
}
public function get( $key ) {
return $this->_items[ $key ];
}

public function rewind() { reset($this->_items); }
public function current() { return current($this->_items); }
public function key() { return key($this->_items); }
public function next() { return next($this->_items); }
public function valid() { return ( $this->current() !== false ); }
}

class DBConfiguration extends Configuration {
...
}

$c = new DBConfiguration();
foreach( $c as $k => $v ) { echo( $k." = ".$v."\n" ); }
?>


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 ];

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!