PHP5中怎么實(shí)現(xiàn)多態(tài)性,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)??h,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
一、 PHP 5和多態(tài)性
本文想討論面向?qū)ο缶幊讨凶顬橹匾牟糠种?-多態(tài)性的設(shè)計(jì)。為了說明問題,我使用了PHP 5。在你繼續(xù)閱讀之前,請(qǐng)首先明確本文并不是完全有關(guān)于PHP的。盡管這種語(yǔ)言在以前的兩個(gè)主要版本中在快速開發(fā)方面已經(jīng)取得很大的進(jìn)步,但是,在其與更為成熟的語(yǔ)言如C++或者Java相匹敵之前,它對(duì)于對(duì)象的支持還要經(jīng)歷一段歷程。
如果你是一位面向?qū)ο缶幊痰娜腴T者,那么本文可能不適合你,因?yàn)镻HP5多態(tài)性這部分知識(shí)比較特別:一旦理解了它,你將永遠(yuǎn)不會(huì)忘記。如果你想簡(jiǎn)單了解一點(diǎn)對(duì)象編程和設(shè)計(jì)知識(shí),并且當(dāng)某人說"某個(gè)對(duì)象是多態(tài)的"時(shí),還不十分清楚這是什么意思的話,那么本文正適合你。
到本文***,你應(yīng)該知道什么是多態(tài)性以及如何把它應(yīng)用到面向?qū)ο蟮脑O(shè)計(jì)中,并且你會(huì)了解PHP 5中對(duì)象編程的優(yōu)點(diǎn)與不足。
二、什么是多態(tài)性?
多態(tài)性,其來(lái)自于dictionary.com的定義是"以不同形式,階段或者類型出現(xiàn)在獨(dú)立的組織中或者同種組織中,而不存在根本區(qū)別。"由該定義,我們可以認(rèn)為,多態(tài)性是一種通過多種狀態(tài)或階段來(lái)描述相同對(duì)象的編程方式。其實(shí),它的真正意義在于:實(shí)際開發(fā)中,我們只需要關(guān)注一個(gè)接口或基類的編程,而不必?fù)?dān)心一個(gè)對(duì)象所屬于的具體類(class)。
如果你熟悉設(shè)計(jì)模式,即使只是有個(gè)初步了解,那么你也會(huì)了解這個(gè)概念。事實(shí)上,PHP5多態(tài)性可能是基于模式設(shè)計(jì)編程中的最偉大的工具。它允許我們以一種邏輯的方式來(lái)組織相類似的對(duì)象從而實(shí)現(xiàn)在具體編碼時(shí)不必?fù)?dān)心對(duì)象的具體類型;而且,我們只需要對(duì)一個(gè)所期望的接口或基類編程即可。一個(gè)應(yīng)用程序越抽象,則它就顯得越靈活--而多態(tài)性是對(duì)行為加以抽象的***的方式之一。
例如,讓我們考慮一個(gè)叫Person的類。我們可以用稱為David,Charles和Alejandro的類來(lái)子類化Person。Person有一個(gè)抽象方法AcceptFeedback(),所有的子類都要實(shí)現(xiàn)這個(gè)方法。這意味著,任何使用基類Person的子類的代碼都能調(diào)用方法AcceptFeedback()。你不必檢查該對(duì)象是一個(gè)David還是一個(gè)Alejandro,僅知道它是一個(gè)Person就夠了。結(jié)果是,你的代碼只需關(guān)注"最小公分母"-Person類即可。
在這個(gè)示例中的Person類也可以被創(chuàng)建為一個(gè)接口。當(dāng)然,與上面相比存在一些區(qū)別,主要在于:一個(gè)接口并沒有給出任何行為,而僅確定了一組規(guī)則。一個(gè)Person接口要求的是"你必須支持AddFeedback()方法",而一個(gè)Person類可以提供一些AddFeedback()方法的缺省代碼-你對(duì)之的理解可以是"如果你不選擇支持AddFeedback(),那么你應(yīng)該提供一種缺省實(shí)現(xiàn)。"至于如何選擇接口或基類則并非本文的主題;但是,一般說來(lái),你需要通過基類來(lái)實(shí)現(xiàn)一個(gè)缺省的方法。如果你能夠簡(jiǎn)單地勾勒出你的類所要實(shí)現(xiàn)的一組期望的功能,那么你也可以使用一個(gè)接口。
三、應(yīng)用PHP5多態(tài)性設(shè)計(jì)
我們將繼續(xù)使用Person基類的例子,現(xiàn)在讓我們分析一個(gè)非多態(tài)性的實(shí)現(xiàn)。下列示例中使用了不同類型的Person對(duì)象--這是一種非常不理想的編程方式。注意,實(shí)際的Person類被省略。目前為止,我們僅關(guān)心代碼調(diào)用的問題。
<?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!'); } ?>
這個(gè)示例展示了行為不同的對(duì)象,還有一個(gè)switch語(yǔ)句用于區(qū)分不同的Person類對(duì)象,從而執(zhí)行其各自相應(yīng)的正確操作。注意,這里針對(duì)不同條件的回饋?zhàn)⑨屖遣煌?。在?shí)際應(yīng)用程序開發(fā)中可能不會(huì)出現(xiàn)這種情形;我僅為了簡(jiǎn)單地說明類實(shí)現(xiàn)中存在的區(qū)別。
下面的一個(gè)示例使用了PHP5多態(tài)性。
<?php $name = $_SESSION['name']; $myPerson = Person::GetPerson($name); $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d')); ?>
注意,這里沒有switch語(yǔ)句,而最重要的是,缺乏有關(guān)Person::GetPerson()會(huì)返回什么類型的對(duì)象。而另一個(gè)Person::AddFeedback()是一個(gè)多態(tài)方法。行為完全是由具體類進(jìn)行封裝的。請(qǐng)記住,在此無(wú)論我們使用的是David,Charles還是Alejandro,調(diào)用代碼從不必了解具體類的功能,而僅知道基類就可以了。
盡管我的示例并不***,但是,從調(diào)用代碼的角度,它已經(jīng)展示了PHP5多態(tài)性的基本用法?,F(xiàn)在我們需要分析這些類的內(nèi)部實(shí)現(xiàn)。從一個(gè)基類進(jìn)行派生的一個(gè)最偉大的地方在于,該派生類能夠存取父類的行為,這種情況常常是缺省的實(shí)現(xiàn),但是也可能出現(xiàn)在類繼承鏈中用于創(chuàng)建更為復(fù)雜的行為。下面是這種情況的一個(gè)簡(jiǎn)單展示。
<?php class Person{ function AddFeedback($comment, $sender, $date){ //把回饋添加到數(shù)據(jù)庫(kù) } } class David extends Person{ function AddFeedback($comment, $sender){ parent::AddFeedback($comment, $sender, date('Y-m-d')); } } ?>
看完上述內(nèi)容,你們掌握PHP5中怎么實(shí)現(xiàn)多態(tài)性的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!