色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

PHP 5.0中多態(tài)性的實(shí)現(xiàn)方案淺析

瀏覽:67日期:2024-02-07 14:39:10

提要:本文將討論多態(tài)性的概念及其在面向?qū)ο笤O(shè)計(jì)中的應(yīng)用,還將分析如何在PHP 5中使用多態(tài)性以及存在的優(yōu)缺點(diǎn)。

PHP的最新發(fā)行版本中已經(jīng)實(shí)現(xiàn)了對遲綁定的支持。當(dāng)然,在使用其遲綁定功能時(shí)還存在很多問題。如果你使用的是更舊版本的PHP(我的服務(wù)器上運(yùn)行的是PHP 5.0.1版本),那么你可能發(fā)現(xiàn)其中缺乏對于遲綁定的支持。因此,請注意本文中的代碼有可能無法工作在你特定的PHP 5版本中。

一、 PHP 5和多態(tài)性

本文想討論面向?qū)ο缶幊讨凶顬橹匾牟糠种?-多態(tài)性的設(shè)計(jì)。為了說明問題,我使用了PHP 5。在你繼續(xù)閱讀之前,請首先明確本文并不是完全有關(guān)于PHP的。盡管這種語言在以前的兩個主要版本中在快速開發(fā)方面已經(jīng)取得很大的進(jìn)步,但是,在其與更為成熟的語言如C++或者Java相匹敵之前,它對于對象的支持還要經(jīng)歷一段歷程。

如果你是一位面向?qū)ο缶幊痰娜腴T者,那么本文可能不適合你,因?yàn)槎鄳B(tài)性這部分知識比較特別:一旦理解了它,你將永遠(yuǎn)不會忘記。如果你想簡單了解一點(diǎn)對象編程和設(shè)計(jì)知識,并且當(dāng)某人說'某個對象是多態(tài)的'時(shí),還不十分清楚這是什么意思的話,那么本文正適合你。到本文最后,你應(yīng)該知道什么是多態(tài)性以及如何把它應(yīng)用到面向?qū)ο蟮脑O(shè)計(jì)中,并且你會了解PHP 5中對象編程的優(yōu)點(diǎn)與不足。

二、什么是多態(tài)性?

多態(tài)性,其來自于dictionary.com的定義是'以不同形式,階段或者類型出現(xiàn)在獨(dú)立的組織中或者同種組織中,而不存在根本區(qū)別。'由該定義,我們可以認(rèn)為,多態(tài)性是一種通過多種狀態(tài)或階段來描述相同對象的編程方式。其實(shí),它的真正意義在于:實(shí)際開發(fā)中,我們只需要關(guān)注一個接口或基類的編程,而不必?fù)?dān)心一個對象所屬于的具體類(class)。

如果你熟悉設(shè)計(jì)模式,即使只是有個初步了解,那么你也會了解這個概念。事實(shí)上,多態(tài)性可能是基于模式設(shè)計(jì)編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實(shí)現(xiàn)在具體編碼時(shí)不必?fù)?dān)心對象的具體類型;而且,我們只需要對一個所期望的接口或基類編程即可。一個應(yīng)用程序越抽象,則它就顯得越靈活--而多態(tài)性是對行為加以抽象的最好的方式之一。

例如,讓我們考慮一個叫Person的類。我們可以用稱為David,Charles和Alejandro的類來子類化Person。Person有一個抽象方法AcceptFeedback(),所有的子類都要實(shí)現(xiàn)這個方法。這意味著,任何使用基類Person的子類的代碼都能調(diào)用方法AcceptFeedback()。你不必檢查該對象是一個David還是一個Alejandro,僅知道它是一個Person就夠了。結(jié)果是,你的代碼只需關(guān)注'最小公分母'-Person類即可。

在這個示例中的Person類也可以被創(chuàng)建為一個接口。當(dāng)然,與上面相比存在一些區(qū)別,主要在于:一個接口并沒有給出任何行為,而僅確定了一組規(guī)則。一個Person接口要求的是'你必須支持AddFeedback()方法',而一個Person類可以提供一些AddFeedback()方法的缺省代碼-你對之的理解可以是'如果你不選擇支持AddFeedback(),那么你應(yīng)該提供一種缺省實(shí)現(xiàn)。'至于如何選擇接口或基類則并非本文的主題;但是,一般說來,你需要通過基類來實(shí)現(xiàn)一個缺省的方法。如果你能夠簡單地勾勒出你的類所要實(shí)現(xiàn)的一組期望的功能,那么你也可以使用一個接口。

三、應(yīng)用多態(tài)性設(shè)計(jì)

我們將繼續(xù)使用Person基類的例子,現(xiàn)在讓我們分析一個非多態(tài)性的實(shí)現(xiàn)。下列示例中使用了不同類型的Person對象--這是一種非常不理想的編程方式。注意,實(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!'); }?>

這個示例展示了行為不同的對象,還有一個switch語句用于區(qū)分不同的Person類對象,從而執(zhí)行其各自相應(yīng)的正確操作。注意,這里針對不同條件的回饋?zhàn)⑨屖遣煌摹T趯?shí)際應(yīng)用程序開發(fā)中可能不會出現(xiàn)這種情形;我僅為了簡單地說明類實(shí)現(xiàn)中存在的區(qū)別。

下面的一個示例使用了多態(tài)性。

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

注意,這里沒有switch語句,而最重要的是,缺乏有關(guān)Person::GetPerson()會返回什么類型的對象。而另一個Person::AddFeedback()是一個多態(tài)方法。行為完全是由具體類進(jìn)行封裝的。請記住,在此無論我們使用的是David,Charles還是Alejandro,調(diào)用代碼從不必了解具體類的功能,而僅知道基類就可以了。

盡管我的示例并不完美,但是,從調(diào)用代碼的角度,它已經(jīng)展示了多態(tài)性的基本用法。現(xiàn)在我們需要分析這些類的內(nèi)部實(shí)現(xiàn)。從一個基類進(jìn)行派生的一個最偉大的地方在于,該派生類能夠存取父類的行為,這種情況常常是缺省的實(shí)現(xiàn),但是也可能出現(xiàn)在類繼承鏈中用于創(chuàng)建更為復(fù)雜的行為。下面是這種情況的一個簡單展示。

<?phpclass Person{ function AddFeedback($comment, $sender, $date){//把回饋添加到數(shù)據(jù)庫 }}class David extends Person{ function AddFeedback($comment, $sender){parent::AddFeedback($comment, $sender,date('Y-m-d')); }}?>

在此,David類中的AddFeedback方法實(shí)現(xiàn)中首先調(diào)用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重載。請記住,這僅是一個簡單化的示例,并且你編寫的實(shí)際代碼完全依賴于你的實(shí)際工程。

四、PHP 5中的遲綁定

依我的看法,遲綁定正是使得Java和C#如此引人注目的重要原因。它們允許基類方法用'this'或$this來調(diào)用方法(即使它們不存在于基類中或調(diào)用一個基類中的方法,它有可能為繼承類中的另一個版本所代替)。你可以認(rèn)為如下的實(shí)現(xiàn)在PHP中是允許的:

<?phpclass Person{ function AddFeedback($messageArray) {$this->ParseFeedback($messageArray);//寫向數(shù)據(jù)庫 }}class David extends Person{ function ParseFeedback($messageArray){// 進(jìn)行一些分析 }}?>

記住,在Person類中并沒有ParseFeedback。現(xiàn)在,假定你擁有這一部分實(shí)現(xiàn)代碼(為了本例說明問題起見),那么這會導(dǎo)致$myPerson成為一個David對象:

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

出現(xiàn)分析錯誤!大致錯誤信息為,方法ParseFeedback并不存在或者一些類似的信息。關(guān)于PHP 5中的遲綁定我們就討論這些!下面我們再歸納一下遲綁定的概念。

遲綁定意味著,方法調(diào)用在最后時(shí)刻才綁定到目標(biāo)對象。這意味著,當(dāng)該方法被運(yùn)行時(shí)刻調(diào)用時(shí),那些對象已經(jīng)有了一種具體類型。在我們上面的示例中,你調(diào)用了David::AddFeedback(),而既然David::AddFeedback()中的$this引用一個David對象,那么你可以邏輯地假定ParseFeedback()方法是存在的--但事實(shí)上它并不存在,因?yàn)锳ddFeedback()是在Person中定義的,并且從Person類中調(diào)用ParseFeedback()。不幸的是,沒有簡單的方法來消除PHP 5中的這種行為。這意味著,當(dāng)你想創(chuàng)建一個靈活的多態(tài)類層次時(shí)你可能有點(diǎn)無能為力。

我必須指出,我選擇PHP 5作為本文的表達(dá)語言僅僅是因?yàn)椋哼@種語言并沒有實(shí)現(xiàn)對象概念的完美抽象!因?yàn)镻HP 5還處于其測試版本運(yùn)行期,所以這是可以諒解的。另外,既然該語言中加入了抽象類和接口,遲綁定也應(yīng)該被實(shí)現(xiàn)。

五、小結(jié)

至此,你應(yīng)該基本了解什么是多態(tài)性以及為什么PHP 5在實(shí)現(xiàn)多態(tài)性方面并不完美。一般說來,你應(yīng)該知道如何用一個多態(tài)性對象模型來封裝有條件的行為。當(dāng)然,這樣會提高你的對象的靈活性,并且意味著更少的代碼實(shí)現(xiàn)。另外,通過封裝滿足一定條件的行為(具體要依賴于對象的狀態(tài)),你還提高了代碼的清晰程度。

標(biāo)簽: PHP
主站蜘蛛池模板: 99在线国产| 国产三级午夜理伦三级 | 国产第一页久久亚洲欧美国产 | 日本一视频一区视频二区 | 亚洲免费在线观看视频 | 久草成人在线视频 | 亚洲午夜成激人情在线影院 | 欧美一级毛片免费看高清 | 亚洲网美女 | 欧美一区二区在线观看视频 | 欧美俄罗斯一级毛片 | 在线亚洲播放 | 亚洲精品在线影院 | 久久亚洲精品中文字幕第一区 | 天天鲁天天爱天天鲁天天 | 97在线视频免费观看 | 国产精品亚洲第五区在线 | 久久久久爽亚洲精品 | 日韩中文字幕在线亚洲一区 | 91香蕉国产线观看免 | 亚洲国产福利精品一区二区 | 99视频精品全国在线观看 | 亚洲欧洲日产国码二区在线 | 日韩免费在线 | 97在线播放视频 | 日韩性片 | 亚洲黄色免费网址 | 欧美一级欧美三级在线观看 | 亚洲综合色dddd26 | 欧美激情伦妇在线观看 | 成人亚洲在线 | 一级做a爰片久久毛片潮喷 一级做a爰片久久毛片美女 | 国产成人精品一区二三区在线观看 | 午夜视频网站 | 99视频在线播放 | 奶交性视频欧美 | 欧美高清一级 | 好吊妞998视频免费观看在线 | 毛片免费视频观看 | 一级做a级爰片性色毛片视频 | 国内外成人免费视频 |