關於PHP多態的理解

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP多態的理解,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP 多態

多態性是指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一訊息將可以產生不同的結果,這種現象稱為多態性。

多態性允許每個對象以適合自身的方式去響應共同的訊息。多態性增強了軟體的靈活性和重用性。

在物件導向的軟體開發中,多態性是最為重要的部分之一。物件導向編程並不只是將相關的方法與資料簡單的結合起來,而是採用物件導向編程中的各種要素將現實生活中的各種情況清晰的描述出來。這一小節將對物件導向編程中的多態性作詳細的講解。

1.什麼是多態

多 態(Polymorphism)按字面上意思理解就是“多種形狀”。可以理解為多種表現形式,也即“一個對外介面,多個內部實現方法”。在物件導向的理論 中,多態性的一般定義為:同一個操作作用於不同的類的執行個體,將產生不同的執行結果。也即不同類的對象收到相同的訊息時,將得到不同的結果。

在實際的應用開發中,採用物件導向中的多態主要在於可以將不同的子類對象都當作一個父類來處理,並且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

2. 多態的應用設計

在實際的應用開發中,通常為了使項目能夠在以後的時間裡的輕鬆實現擴充與升級,需要通過繼承實現可複用模組進行輕鬆升級。在進行可複用模組設計時,就需要儘可能的減少使用流程式控制制語句。此時就可以採用多態實現該類設計。
【樣本】例舉了通常採用流程式控制制語句實現不同類的處理。其代碼如下所示。

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());                     //顯示員工工作

分析:在上述程式中,首先定義兩個員工類:油漆工類和打字員類。然後定義一個處理函數,在該函數中,判斷員工是否為已經定義的員工,列印出員工的工作狀態。其結果如下所示。

油漆工正在刷漆
打字員正在打字

從 以上程式可輕鬆看出,若想顯示其幾種員工的工作狀態,需要首先定義該員工類,並在該員工類中定義員工的工作,然後在printworking()函數中增 加elseif語句以檢查對象是哪一員工類的執行個體。這在實際的應用中,是非常不可取的。若此時採用多態,則可以輕鬆解決此問題。

可以首先建立一個員工父類,所有的員工類將繼承自該員工父類,並且繼承父類的所有方法與屬性。然後在員工類中建立“是一”關係,判斷是否為合法的員工。

【樣本】例舉了採用多態的方式改寫上例。其代碼如下所示。

class employee{//定義員工父類   protected function working(){//定義員工工作,需要在子類的實現       echo "本方法需要在子類中重載!";   }}class painter extends employee{//定義油漆工類   public function working(){//實現繼承的工作方法       echo "油漆工正在刷漆!\n";   }}class typist extends employee{//定義打字員類   public function working(){       echo "打字員正在打字!\n";   }}class manager extends employee{//定義經理類   public function working(){       echo "經理開會中!";   }}function printworking($obj){//定義處理方法   if($obj instanceof employee){//若是員工對象,則顯示其工作狀態       $obj->working();   }else{//否則顯示錯誤資訊       echo "Error: 對象錯誤!";   }}printworking(new painter());//顯示油漆工的工作printworking(new typist());//顯示打字員的工作printworking(new manager());//顯示經理的工作

分析:在上述程式中,首先定義一個員工基類,並定義一個員工工作狀態的方法。然後定義將繼承自員工基類的三個員工類:油漆工類、打字員類和經理類。然後定義顯示員工工作狀態的方法。並在該方法中建立一個“是一”關係,用於判斷是否為合法的員工。其結果如下所示。

油漆工正在刷漆!
打字員正在打字!
經理開會中!

從上例可發現,無論增加多少個員工類,只需要實現自員工父類繼承的該員工類和方法。而無須修改顯示員工工作狀態的方法printworking()。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關推薦:

PHP檔案編程的介紹

PHP基本文法的介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.