探討PHP5多態性的具體實現方式_PHP教程

來源:互聯網
上載者:User
PHP5作為一個新版本,實現了對遲綁定的支援,不過在實際應用中,遲綁定功能還存在一些問題,比如你使用的是更舊版本的PHP,那麼你可能發現其中缺乏對於遲綁定的支援。我們今天為大家講的就是關於 一、 PHP 5和多態性

本文想討論物件導向編程中最為重要的部分之一--多態性的設計。為了說明問題,我使用了PHP 5。在你繼續閱讀之前,請首先明確本文並不是完全有關於PHP的。儘管這種語言在以前的兩個主要版本中在快速開發方面已經取得很大的進步,但是,在其與更為成熟的語言如C++或者Java相匹敵之前,它對於對象的支援還要經曆一段曆程。

如果你是一位物件導向編程的入門者,那麼本文可能不適合你,因為PHP5多態性這部分知識比較特別:一旦理解了它,你將永遠不會忘記。如果你想簡單瞭解一點對象編程和設計知識,並且當某人說"某個對象是多態的"時,還不十分清楚這是什麼意思的話,那麼本文正適合你。

到本文最後,你應該知道什麼是多態性以及如何把它應用到物件導向的設計中,並且你會瞭解PHP 5中對象編程的優點與不足。

二、什麼是多態性?

多態性,其來自於dictionary.com的定義是"以不同形式,階段或者類型出現在獨立的組織中或者同種組織中,而不存在根本區別。"由該定義,我們可以認為,多態性是一種通過多種狀態或階段來描述相同對象的編程方式。其實,它的真正意義在於:實際開發中,我們只需要關注一個介面或基類的編程,而不必擔心一個對象所屬於的具體類(class)。

如果你熟悉設計模式,即使只是有個初步瞭解,那麼你也會瞭解這個概念。事實上,PHP5多態性可能是基於模式設計編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實現在具體編碼時不必擔心對象的具體類型;而且,我們只需要對一個所期望的介面或基類編程即可。一個應用程式越抽象,則它就顯得越靈活--而多態性是對行為加以抽象的最好的方式之一。

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

在這個樣本中的Person類也可以被建立為一個介面。當然,與上面相比存在一些區別,主要在於:一個介面並沒有給出任何行為,而僅確定了一組規則。一個Person介面要求的是"你必須支援AddFeedback()方法",而一個Person類可以提供一些AddFeedback()方法的預設代碼-你對之的理解可以是"如果你不選擇支援AddFeedback(),那麼你應該提供一種預設實現。"至於如何選擇介面或基類則並非本文的主題;但是,一般說來,你需要通過基類來實現一個預設的方法。如果你能夠簡單地勾勒出你的類所要實現的一組期望的功能,那麼你也可以使用一個介面。

三、應用PHP5多態性設計

我們將繼續使用Person基類的例子,現在讓我們分析一個非多態性的實現。下列樣本中使用了不同類型的Person對象--這是一種非常不理想的編程方式。注意,實際的Person類被省略。目前為止,我們僅關心代碼調用的問題。

 
  1. <?php
  2.  $name = $_SESSION['name'];
  3.  $myPerson = Person::GetPerson($name);
  4.  switch (get_class($myPerson)){
  5. case 'David' :
  6.  $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d'));
  7.  break;
  8. case 'Charles':
  9.  $myPerson->feedback[] = array('Some Reader', 'Great Editing!');
  10.  break;
  11. case 'Alejandro' :
  12.  $myPerson->Feedback->Append('Awesome JavaScript!');
  13.  break;
  14. default :
  15.  $myPerson->AddFeedback('Yay!');
  16.  }
  17. ?>

這個樣本展示了行為不同的對象,還有一個switch語句用於區分不同的Person類對象,從而執行其各自相應的正確操作。注意,這裡針對不同條件的回饋注釋是不同的。在實際應用程式開發中可能不會出現這種情形;我僅為了簡單地說明類實現中存在的區別。

下面的一個樣本使用了PHP5多態性。

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

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

儘管我的樣本並不完美,但是,從調用代碼的角度,它已經展示了PHP5多態性的基本用法。現在我們需要分析這些類的內部實現。從一個基類進行派生的一個最偉大的地方在於,該衍生類別能夠存取父類的行為,這種情況常常是預設的實現,但是也可能出現在類繼承鏈中用於建立更為複雜的行為。下面是這種情況的一個簡單展示。

 
  1. <?php
  2. class Person{
  3.  function AddFeedback($comment, $sender, $date){
  4. //把回饋添加到資料庫
  5.  }
  6. }
  7. class David extends Person{
  8.  function AddFeedback($comment, $sender){
  9. parent::AddFeedback($comment, $sender,
  10. date('Y-m-d'));
  11.  }
  12. }
  13. ?>

在此,David類中的AddFeedback方法實現中首先調用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重載。請記住,這僅是一個簡單化的樣本,並且你編寫的PHP5多態性實際代碼完全依賴於你的實際工程。


http://www.bkjia.com/PHPjc/446414.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/446414.htmlTechArticlePHP5作為一個新版本,實現了對遲綁定的支援,不過在實際應用中,遲綁定功能還存在一些問題,比如你使用的是更舊版本的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.