首页 php教程 php手册 探讨PHP5多态性的具体实现方式

探讨PHP5多态性的具体实现方式

Jun 13, 2016 am 11:05 AM
php5 具体 多态 实现 探讨 支持 新版本 方式

PHP5作为一个新版本,实现了对迟绑定的支持,不过在实际应用中,迟绑定功能还存在一些问题,比如你使用的是更旧版本的PHP,那么你可能发现其中缺乏对于迟绑定的支持。我们今天为大家讲的就是关于一、 PHP 5和多态性

本文想讨论面向对象编程中最为重要的部分之一--多态性的设计。为了说明问题,我使用了PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于PHP的。尽管这种语言在以前的两个主要版本中在快速开发方面已经取得很大的进步,但是,在其与更为成熟的语言如C++或者Java相匹敌之前,它对于对象的支持还要经历一段历程。

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

到本文最后,你应该知道什么是多态性以及如何把它应用到面向对象的设计中,并且你会了解PHP 5中对象编程的优点与不足。

二、什么是多态性?

多态性,其来自于dictionary.com的定义是"以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。"由该定义,我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类(class)。

如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,PHP5多态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活--而多态性是对行为加以抽象的最好的方式之一。

例如,让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码只需关注"最小公分母"-Person类即可。

在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是"你必须支持AddFeedback()方法",而一个Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是"如果你不选择支持AddFeedback(),那么你应该提供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

三、应用PHP5多态性设计

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

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class="">
<span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name'];   </span>
</li>
<li class="alt">
<span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name);   </span>
</li>
<li class=""><span> switch (get_class($myPerson)){   </span></li>
<li class="alt"><span>case 'David' :   </span></li>
<li class=""><span> $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d'));   </span></li>
<li class="alt"><span> break;   </span></li>
<li class=""><span>case 'Charles':   </span></li>
<li class="alt"><span> $myPerson->feedback[] = array('Some Reader', 'Great Editing!');   </span></li>
<li class=""><span> break;   </span></li>
<li class="alt"><span>case 'Alejandro' :   </span></li>
<li class=""><span> $myPerson->Feedback->Append('Awesome JavaScript!');   </span></li>
<li class="alt"><span> break;   </span></li>
<li class=""><span>default :   </span></li>
<li class="alt"><span> $myPerson->AddFeedback('Yay!');   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
登录后复制

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

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

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class="">
<span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name'];   </span>
</li>
<li class="alt">
<span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name);   </span>
</li>
<li class=""><span> $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d'));   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
登录后复制

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

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

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class=""><span>class Person{   </span></li>
<li class="alt"><span> function AddFeedback($comment, $sender, $date){   </span></li>
<li class=""><span>//把回馈添加到数据库   </span></li>
<li class="alt"><span> }   </span></li>
<li class=""><span>}   </span></li>
<li class="alt"><span>class David extends Person{   </span></li>
<li class=""><span> function AddFeedback($comment, $sender){   </span></li>
<li class="alt"><span>parent::AddFeedback($comment, $sender,   </span></li>
<li class=""><span>date('Y-m-d'));   </span></li>
<li class="alt"><span> }   </span></li>
<li class=""><span>}   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
登录后复制

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


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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

华为手机如何实现双微信登录? 华为手机如何实现双微信登录? Mar 24, 2024 am 11:27 AM

华为手机如何实现双微信登录?随着社交媒体的兴起,微信已经成为人们日常生活中不可或缺的沟通工具之一。然而,许多人可能会遇到一个问题:在同一部手机上同时登录多个微信账号。对于华为手机用户来说,实现双微信登录并不困难,本文将介绍华为手机如何实现双微信登录的方法。首先,华为手机自带的EMUI系统提供了一个很便利的功能——应用双开。通过应用双开功能,用户可以在手机上同

如何在华为手机上实现微信分身功能 如何在华为手机上实现微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在华为手机上实现微信分身功能随着社交软件的普及和人们对隐私安全的日益重视,微信分身功能逐渐成为人们关注的焦点。微信分身功能可以帮助用户在同一台手机上同时登录多个微信账号,方便管理和使用。在华为手机上实现微信分身功能并不困难,只需要按照以下步骤操作即可。第一步:确保手机系统版本和微信版本符合要求首先,确保你的华为手机系统版本已更新到最新版本,以及微信App

PHP编程指南:实现斐波那契数列的方法 PHP编程指南:实现斐波那契数列的方法 Mar 20, 2024 pm 04:54 PM

编程语言PHP是一种用于Web开发的强大工具,能够支持多种不同的编程逻辑和算法。其中,实现斐波那契数列是一个常见且经典的编程问题。在这篇文章中,将介绍如何使用PHP编程语言来实现斐波那契数列的方法,并附上具体的代码示例。斐波那契数列是一个数学上的序列,其定义如下:数列的第一个和第二个元素为1,从第三个元素开始,每个元素的值等于前两个元素的和。数列的前几个元

藏宝图现世《零纪元》一起寻找宝藏,欢度五一吧! 藏宝图现世《零纪元》一起寻找宝藏,欢度五一吧! May 03, 2024 pm 12:43 PM

《零纪元》传说很久以前有个叫潘神的守财奴,他生前收集了大量财宝,但在他死后这些财宝也跟着一起消失了,只留下一个传言,潘神修建了一个巨大的迷宫陵墓,把财宝藏在里面,可惜至今仍未有人发现。只有赌上生命,才能找到那些绝世珍宝,这一盘,你敢不敢赌!找到宝藏箱有可能获得装备养成道具、迷之银币包。那么藏宝图从哪里获得呢?每日商运任务即可获得,藏宝图分为3种:冰岛藏宝图、荒野藏宝图、雨林藏宝图,找到藏宝图所标示的宝藏位置可以挖掘宝藏。并且挖掘宝藏会随机遇上不同的事件:有概率惊动守护宝藏的BOSS,BOSS死亡

C++虚函数表与多态实现,如何避免内存浪费 C++虚函数表与多态实现,如何避免内存浪费 May 31, 2024 pm 07:03 PM

虚基类可优化虚函数表内存开销,通过允许从多个基类继承而无需创建额外虚函数表。在优化后代码中,形状基类不再有虚函数表,圆和矩形类共享同一个虚函数表,从而减少了内存消耗。

掌握Golang如何实现游戏开发的可能性 掌握Golang如何实现游戏开发的可能性 Mar 16, 2024 pm 12:57 PM

在当今的软件开发领域中,Golang(Go语言)作为一种高效、简洁、并发性强的编程语言,越来越受到开发者的青睐。其丰富的标准库和高效的并发特性使它成为游戏开发领域的一个备受关注的选择。本文将探讨如何利用Golang来实现游戏开发,并通过具体的代码示例来展示其强大的可能性。1.Golang在游戏开发中的优势作为一种静态类型语言,Golang在构建大型游戏系统

《阴阳师》全新版本「福神巡游」将启,版本活动「福神巡礼」来袭! 《阴阳师》全新版本「福神巡游」将启,版本活动「福神巡礼」来袭! Mar 30, 2024 pm 02:56 PM

《阴阳师》全新版本「福神巡游」4月3日将启,版本活动「福神巡礼」随之开启!快前来退治侵袭的海妖,一同踏上收集福运的旅途——【版本活动「福神巡礼」】-活动时间-4月3日维护后-4月9日23:59【玩法介绍】本次活动包含:退治海妖、遥归轶事、收集福运、福神礼帖、巡礼商店等玩法,等级≥15级的阴阳师可点击庭院中的晨晖惠比寿或庭院右上角小纸人参与活动。-退治海妖-消耗「鲷鱼烧」或「体力」可获得活动奖励。晨晖惠比寿也将共同参战!挑战成功即可获得「福运泡泡」、「福神羁绊」等奖励。随着退治海妖层数的提升,可获

《零纪元》开启一个科技与魔法相结合的全新纪元! 《零纪元》开启一个科技与魔法相结合的全新纪元! Jun 02, 2024 am 09:45 AM

《零纪元》是由嘻哈部落平台代理的一款2.5D未来幻想大型多人角色扮演网络游戏,以末日后的重建世界为题材,呈现一个魔幻与科技并存的神秘新世界,拥有蒸汽科技、自创技能等革新玩法,将充满无尽变化与想象力的蒸汽朋克文化展现得淋漓尽致。装备除了可以良好的保护人物,降低冒险途中遇到的伤害,还能把人的潜力提升到极限,使冒险者能够发挥出超常的实力。而对于冒险者来说,拥有一件特别的装备,甚至一种身份与历练的象征。装备分为6个品质级别:普通(白)、良好(绿)、优秀(蓝)、稀有(紫)、英雄(粉)、传说(橙色)。普通(

See all articles