這篇文章主要介紹了關於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()。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
#以上是關於PHP多態性的理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!