深入php多態(tài)的實(shí)現(xiàn)詳解
更新時間:2013年06月09日 14:59:26 作者:
本篇文章是對php多態(tài)的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
多態(tài)性是指相同的操作或函數(shù)、過程可作用于多種類型的對象上并獲得不同的結(jié)果。不同的對象,收到同一消息將可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。
多態(tài)性允許每個對象以適合自身的方式去響應(yīng)共同的消息。多態(tài)性增強(qiáng)了軟件的靈活性和重用性。
在面向?qū)ο蟮能浖_發(fā)中,多態(tài)性是最為重要的部分之一。面向?qū)ο缶幊滩⒉恢皇菍⑾嚓P(guān)的方法與數(shù)據(jù)簡單的結(jié)合起來,而是采用面向?qū)ο缶幊讨械母鞣N要素將現(xiàn)實(shí)生活中的各種情況清晰的描述出來。這一小節(jié)將對面向?qū)ο缶幊讨械亩鄳B(tài)性作詳細(xì)的講解。
1.什么是多態(tài)
多 態(tài)(Polymorphism)按字面上意思理解就是“多種形狀”??梢岳斫鉃槎喾N表現(xiàn)形式,也即“一個對外接口,多個內(nèi)部實(shí)現(xiàn)方法”。在面向?qū)ο蟮睦碚?中,多態(tài)性的一般定義為:同一個操作作用于不同的類的實(shí)例,將產(chǎn)生不同的執(zhí)行結(jié)果。也即不同類的對象收到相同的消息時,將得到不同的結(jié)果。
在實(shí)際的應(yīng)用開發(fā)中,采用面向?qū)ο笾械亩鄳B(tài)主要在于可以將不同的子類對象都當(dāng)作一個父類來處理,并且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
2.多態(tài)的應(yīng)用設(shè)計
在實(shí)際的應(yīng)用開發(fā)中,通常為了使項(xiàng)目能夠在以后的時間里的輕松實(shí)現(xiàn)擴(kuò)展與升級,需要通過繼承實(shí)現(xiàn)可復(fù)用模塊進(jìn)行輕松升級。在進(jìn)行可復(fù)用模塊設(shè)計時,就需要盡可能的減少使用流程控制語句。此時就可以采用多態(tài)實(shí)現(xiàn)該類設(shè)計。
【示例】例舉了通常采用流程控制語句實(shí)現(xiàn)不同類的處理。其代碼如下所示。
<?php
class painter{ //定義油漆工類
public function paintbrush(){ //定義油漆工動作
echo "油漆工正在刷漆!/n";
}
}
class typist{ //定義打字員類
public function typed(){ //定義打字員工作
echo "打字員正在打字!/n";
}
}
function printworking($obj){ //定義處理類
if($obj instanceof painter){ //若對象是油漆工類,則顯示油漆工動作
$obj->paintbrush();
}elseif($obj instanceof typist){ //若對象是打字員類,則顯示打字員動作
$obj->typed();
}else{ //若非以上類,則顯示出錯信息
echo "Error: 對象錯誤!";
}
}
printworking(new painter()); //顯示員工工作
printworking(new typist()); //顯示員工工作
?>
分析:在上述程序中,首先定義兩個員工類:油漆工類和打字員類。然后定義一個處理函數(shù),在該函數(shù)中,判斷員工是否為已經(jīng)定義的員工,打印出員工的工作狀態(tài)。其結(jié)果如下所示。
油漆工正在刷漆
打字員正在打字
從 以上程序可輕松看出,若想顯示其幾種員工的工作狀態(tài),需要首先定義該員工類,并在該員工類中定義員工的工作,然后在printworking()函數(shù)中增 加elseif語句以檢查對象是哪一員工類的實(shí)例。這在實(shí)際的應(yīng)用中,是非常不可取的。若此時采用多態(tài),則可以輕松解決此問題。
可以首先創(chuàng)建一個員工父類,所有的員工類將繼承自該員工父類,并且繼承父類的所有方法與屬性。然后在員工類中創(chuàng)建“是一”關(guān)系,判斷是否為合法的員工。
【示例】例舉了采用多態(tài)的方式改寫上例。其代碼如下所示。
<?php
class employee{//定義員工父類
protected function working(){//定義員工工作,需要在子類的實(shí)現(xiàn)
echo "本方法需要在子類中重載!";
}
}
class painter extends employee{//定義油漆工類
public function working(){//實(shí)現(xiàn)繼承的工作方法
echo "油漆工正在刷漆!/n";
}
}
class typist extends employee{//定義打字員類
public function working(){
echo "打字員正在打字!/n";
}
}
class manager extends employee{//定義經(jīng)理類
public function working(){
echo "經(jīng)理正在開會!";
}
}
function printworking($obj){//定義處理方法
if($obj instanceof employee){//若是員工對象,則顯示其工作狀態(tài)
$obj->working();
}else{//否則顯示錯誤信息
echo "Error: 對象錯誤!";
}
}
printworking(new painter());//顯示油漆工的工作
printworking(new typist());//顯示打字員的工作
printworking(new manager());//顯示經(jīng)理的工作
?>
分析:在上述程序中,首先定義一個員工基類,并定義一個員工工作狀態(tài)的方法。然后定義將繼承自員工基類的三個員工類:油漆工類、打字員類和經(jīng)理類。然后定義顯示員工工作狀態(tài)的方法。并在該方法中創(chuàng)建一個“是一”關(guān)系,用于判斷是否為合法的員工。其結(jié)果如下所示。
油漆工正在刷漆!
打字員正在打字!
經(jīng)理正在開會!
從上例可發(fā)現(xiàn),無論增加多少個員工類,只需要實(shí)現(xiàn)自員工父類繼承的該員工類和方法。而無須修改顯示員工工作狀態(tài)的方法printworking()。
多態(tài)性允許每個對象以適合自身的方式去響應(yīng)共同的消息。多態(tài)性增強(qiáng)了軟件的靈活性和重用性。
在面向?qū)ο蟮能浖_發(fā)中,多態(tài)性是最為重要的部分之一。面向?qū)ο缶幊滩⒉恢皇菍⑾嚓P(guān)的方法與數(shù)據(jù)簡單的結(jié)合起來,而是采用面向?qū)ο缶幊讨械母鞣N要素將現(xiàn)實(shí)生活中的各種情況清晰的描述出來。這一小節(jié)將對面向?qū)ο缶幊讨械亩鄳B(tài)性作詳細(xì)的講解。
1.什么是多態(tài)
多 態(tài)(Polymorphism)按字面上意思理解就是“多種形狀”??梢岳斫鉃槎喾N表現(xiàn)形式,也即“一個對外接口,多個內(nèi)部實(shí)現(xiàn)方法”。在面向?qū)ο蟮睦碚?中,多態(tài)性的一般定義為:同一個操作作用于不同的類的實(shí)例,將產(chǎn)生不同的執(zhí)行結(jié)果。也即不同類的對象收到相同的消息時,將得到不同的結(jié)果。
在實(shí)際的應(yīng)用開發(fā)中,采用面向?qū)ο笾械亩鄳B(tài)主要在于可以將不同的子類對象都當(dāng)作一個父類來處理,并且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
2.多態(tài)的應(yīng)用設(shè)計
在實(shí)際的應(yīng)用開發(fā)中,通常為了使項(xiàng)目能夠在以后的時間里的輕松實(shí)現(xiàn)擴(kuò)展與升級,需要通過繼承實(shí)現(xiàn)可復(fù)用模塊進(jìn)行輕松升級。在進(jìn)行可復(fù)用模塊設(shè)計時,就需要盡可能的減少使用流程控制語句。此時就可以采用多態(tài)實(shí)現(xiàn)該類設(shè)計。
【示例】例舉了通常采用流程控制語句實(shí)現(xiàn)不同類的處理。其代碼如下所示。
復(fù)制代碼 代碼如下:
<?php
class painter{ //定義油漆工類
public function paintbrush(){ //定義油漆工動作
echo "油漆工正在刷漆!/n";
}
}
class typist{ //定義打字員類
public function typed(){ //定義打字員工作
echo "打字員正在打字!/n";
}
}
function printworking($obj){ //定義處理類
if($obj instanceof painter){ //若對象是油漆工類,則顯示油漆工動作
$obj->paintbrush();
}elseif($obj instanceof typist){ //若對象是打字員類,則顯示打字員動作
$obj->typed();
}else{ //若非以上類,則顯示出錯信息
echo "Error: 對象錯誤!";
}
}
printworking(new painter()); //顯示員工工作
printworking(new typist()); //顯示員工工作
?>
分析:在上述程序中,首先定義兩個員工類:油漆工類和打字員類。然后定義一個處理函數(shù),在該函數(shù)中,判斷員工是否為已經(jīng)定義的員工,打印出員工的工作狀態(tài)。其結(jié)果如下所示。
油漆工正在刷漆
打字員正在打字
從 以上程序可輕松看出,若想顯示其幾種員工的工作狀態(tài),需要首先定義該員工類,并在該員工類中定義員工的工作,然后在printworking()函數(shù)中增 加elseif語句以檢查對象是哪一員工類的實(shí)例。這在實(shí)際的應(yīng)用中,是非常不可取的。若此時采用多態(tài),則可以輕松解決此問題。
可以首先創(chuàng)建一個員工父類,所有的員工類將繼承自該員工父類,并且繼承父類的所有方法與屬性。然后在員工類中創(chuàng)建“是一”關(guān)系,判斷是否為合法的員工。
【示例】例舉了采用多態(tài)的方式改寫上例。其代碼如下所示。
復(fù)制代碼 代碼如下:
<?php
class employee{//定義員工父類
protected function working(){//定義員工工作,需要在子類的實(shí)現(xiàn)
echo "本方法需要在子類中重載!";
}
}
class painter extends employee{//定義油漆工類
public function working(){//實(shí)現(xiàn)繼承的工作方法
echo "油漆工正在刷漆!/n";
}
}
class typist extends employee{//定義打字員類
public function working(){
echo "打字員正在打字!/n";
}
}
class manager extends employee{//定義經(jīng)理類
public function working(){
echo "經(jīng)理正在開會!";
}
}
function printworking($obj){//定義處理方法
if($obj instanceof employee){//若是員工對象,則顯示其工作狀態(tài)
$obj->working();
}else{//否則顯示錯誤信息
echo "Error: 對象錯誤!";
}
}
printworking(new painter());//顯示油漆工的工作
printworking(new typist());//顯示打字員的工作
printworking(new manager());//顯示經(jīng)理的工作
?>
分析:在上述程序中,首先定義一個員工基類,并定義一個員工工作狀態(tài)的方法。然后定義將繼承自員工基類的三個員工類:油漆工類、打字員類和經(jīng)理類。然后定義顯示員工工作狀態(tài)的方法。并在該方法中創(chuàng)建一個“是一”關(guān)系,用于判斷是否為合法的員工。其結(jié)果如下所示。
油漆工正在刷漆!
打字員正在打字!
經(jīng)理正在開會!
從上例可發(fā)現(xiàn),無論增加多少個員工類,只需要實(shí)現(xiàn)自員工父類繼承的該員工類和方法。而無須修改顯示員工工作狀態(tài)的方法printworking()。
相關(guān)文章
php 處理上百萬條的數(shù)據(jù)庫如何提高處理查詢速度
php 處理上百萬條的數(shù)據(jù)庫如何提高處理查詢速度2010-02-02PHP pthreads v3下同步處理synchronized用法示例
這篇文章主要介紹了PHP pthreads v3下同步處理synchronized用法,結(jié)合實(shí)例形式分析了PHP pthreads v3下同步處理synchronized原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02