首頁 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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系統提供了一個很方便的功能-應用程式雙開。透過應用程式雙開功能,用戶可以在手機上同

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

虛基底類別可最佳化虛擬函數表記憶體開銷,透過允許從多個基底類別繼承而無需建立額外虛函數表。在最佳化後程式碼中,形狀基底類別不再有虛擬函數表,圓和矩形類別共享同一個虛擬函數表,從而減少了記憶體消耗。

如何在華為手機上實現微信分身功能 如何在華為手機上實現微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在華為手機上實現微信分身功能隨著社群軟體的普及和人們對隱私安全的日益重視,微信分身功能逐漸成為人們關注的焦點。微信分身功能可以幫助使用者在同一台手機上同時登入多個微信帳號,方便管理和使用。在華為手機上實現微信分身功能並不困難,只需要按照以下步驟操作即可。第一步:確保手機系統版本和微信版本符合要求首先,確保你的華為手機系統版本已更新至最新版本,以及微信App

掌握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