0

0

编程设计:PHP 5中多态性的实现方案浅析

php中文网

php中文网

发布时间:2016-06-21 09:04:57

|

1135人浏览过

|

来源于php中文网

原创

作者:朱先忠编译

  提要:本文将讨论多态性的概念及其在面向对象设计中的应用,还将分析如何在PHP 5中使用多态性以及存在的优缺点。

  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(),那么你应该提供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

  三、应用多态性设计

  我们将继续使用Person基类的例子,现在让我们分析一个非多态性的实现。下列示例中使用了不同类型的Person对象--这是一种非常不理想的编程方式。注意,实际的Person类被省略。目前为止,我们仅关心代码调用的问题。

<?php
 $name = $_SESSION['name'];
 $myPerson = Person::GetPerson($name);
 switch (get_class($myPerson)){
  case 'David' :
   $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d'));
   break;
  case 'Charles':
   $myPerson->feedback[] = array('Some Reader', 'Great Editing!');
   break;
  case 'Alejandro' :
   $myPerson->Feedback->Append('Awesome Javascript!');
   break;
  default :
   $myPerson->AddFeedback('Yay!');
 }
?>

  这个示例展示了行为不同的对象,还有一个switch语句用于区分不同的Person类对象,从而执行其各自相应的正确操作。注意,这里针对不同条件的回馈注释是不同的。在实际应用程序开发中可能不会出现这种情形;我仅为了简单地说明类实现中存在的区别。

  下面的一个示例使用了多态性。

<?php
 $name = $_SESSION['name'];
 $myPerson = Person::GetPerson($name);
 $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d'));
?>

  注意,这里没有switch语句,而最重要的是,缺乏有关Person::GetPerson()会返回什么类型的对象。而另一个Person::AddFeedback()是一个多态方法。行为完全是由具体类进行封装的。请记住,在此无论我们使用的是David,Charles还是Alejandro,调用代码从不必了解具体类的功能,而仅知道基类就可以了。

  尽管我的示例并不完美,但是,从调用代码的角度,它已经展示了多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。

<?php
class Person{
 function AddFeedback($comment, $sender, $date){
  //把回馈添加到数据库
 }
}
class David extends Person{
 function AddFeedback($comment, $sender){
  parent::AddFeedback($comment, $sender,
  date('Y-m-d'));
 }
}
?>

  在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是一个简单化的示例,并且你编写的实际代码完全依赖于你的实际工程。

动感购物HTML
动感购物HTML

修正了V1.10的一些BUG感购物HTML系统是集合目前网络所有购物系统为参考而开发,代码采用DIV编号,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于

下载

四、PHP 5中的迟绑定

  依我的看法,迟绑定正是使得Java和C#如此引人注目的重要原因。它们允许基类方法用"this"或$this来调用方法(即使它们不存在于基类中或调用一个基类中的方法,它有可能为继承类中的另一个版本所代替)。你可以认为如下的实现在PHP中是允许的:

<?php
class Person{
 function AddFeedback($messageArray) {
  $this->ParseFeedback($messageArray);
  //写向数据库
 }
}
class David extends Person{
 function ParseFeedback($messageArray){
  // 进行一些分析
 }
}
?>

  记住,在Person类中并没有ParseFeedback。现在,假定你拥有这一部分实现代码(为了本例说明问题起见),那么这会导致$myPerson成为一个David对象:

<?php
$myPerson = Person::GetPerson($name);
$myPerson->AddFeedback($messageArray);
?>

  出现分析错误!大致错误信息为,方法ParseFeedback并不存在或者一些类似的信息。关于PHP 5中的迟绑定我们就讨论这些!下面我们再归纳一下迟绑定的概念。

  迟绑定意味着,方法调用在最后时刻才绑定到目标对象。这意味着,当该方法被运行时刻调用时,那些对象已经有了一种具体类型。在我们上面的示例中,你调用了David::AddFeedback(),而既然David::AddFeedback()中的$this引用一个David对象,那么你可以逻辑地假定ParseFeedback()方法是存在的--但事实上它并不存在,因为AddFeedback()是在Person中定义的,并且从Person类中调用ParseFeedback()。
不幸的是,没有简单的方法来消除PHP 5中的这种行为。这意味着,当你想创建一个灵活的多态类层次时你可能有点无能为力。

  我必须指出,我选择PHP 5作为本文的表达语言仅仅是因为:这种语言并没有实现对象概念的完美抽象!因为PHP 5还处于其测试版本运行期,所以这是可以谅解的。另外,既然该语言中加入了抽象类和接口,迟绑定也应该被实现。

  五、小结

  至此,你应该基本了解什么是多态性以及为什么PHP 5在实现多态性方面并不完美。一般说来,你应该知道如何用一个多态性对象模型来封装有条件的行为。当然,这样会提高你的对象的灵活性,并且意味着更少的代码实现。另外,通过封装满足一定条件的行为(具体要依赖于对象的状态),你还提高了代码的清晰程度。



相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号