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(),那么你应该提供一种缺