background image

PHP 5.0 中多态性的实现方案浅析

提要:本文将讨论多态性的概念及其在面向对象设计中的应用,还将分析如何在

PHP5

中使用多态性以及存在的优缺点。
  

PHP 的最新发行版本中已经实现了对迟绑定的支持。当然,在使用其迟绑定功能时还存

在很多问题。如果你使用的是更旧版本的

PHP(我的服务器上运行的是 PHP 5.0.1 版本),那

么你可能发现其中缺乏对于迟绑定的支持。因此,请注意本文中的代码有可能无法工作在你
特定的

PHP 5 版本中。

  一、

 PHP 5 和多态性

  本文想讨论面向对象编程中最为重要的部分之一

--多态性的设计。为了说明问题,我使

用了

PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于 PHP 的。尽管这种语言

在以前的两个主要版本中在快速开发方面已经取得很大的进步,但是,在其与更为成熟的
语言如

C++或者 Java 相匹敌之前,它对于对象的支持还要经历一段历程。

  如果你是一位面向对象编程的入门者,那么本文可能不适合你,因为多态性这部分知
识比较特别:一旦理解了它,你将永远不会忘记。如果你想简单了解一点对象编程和设计知
识,并且当某人说

"某个对象是多态的"时,还不十分清楚这是什么意思的话,那么本文正

适合你。
  到本文最后,你应该知道什么是多态性以及如何把它应用到面向对象的设计中,并且
你会了解

PHP 5 中对象编程的优点与不足。

  二、什么是多态性

?

  多态性,其来自于

dictionary.com 的定义是"以不同形式,阶段或者类型出现在独立的

组织中或者同种组织中,而不存在根本区别。

"由该定义,我们可以认为,多态性是一种通

过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我
们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类

(class)。

  如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,多
态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类
似的对象从而实现在具体编码时不必担心对象的具体类型

;而且,我们只需要对一个所期望

的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活

--而多态性是对行为加以

抽象的最好的方式之一。
  例如,让我们考虑一个叫

Person 的类。我们可以用称为 David,Charles 和 Alejandro 的

类来子类化

Person。 Person 有一个抽象方法 AcceptFeedback(),所有的子类都要实现这个方

法。这意味着,任何使用基类

Person 的子类的代码都能调用方法 AcceptFeedback()。你不必

检查该对象是一个

David 还是一个 Alejandro,仅知道它是一个 Person 就够了。结果是,你

的代码只需关注

"最小公分母"-Person 类即可。

  在这个示例中的

Person 类也可以被创建为一个接口。当然,与上面相比存在一些区别,

主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个

Person 接口要求的

"你必须支持 AddFeedback()方法",而一个 Person 类可以提供一些 AddFeedback()方法的

缺省代码

-你对之的理解可以是"如果你不选择支持 AddFeedback(),那么你应该提供一种缺