PHP物件導向(五)

來源:互聯網
上載者:User

標籤:

一、抽象方法和抽象類別
  在OOP語言中,一個類可以有一個或多個子類,而每個類都有至少一個公有方法做為外部代碼訪問其的介面。而抽象方法就是為了方便繼承而引入的。

  抽象方法:當類中有一個方法,他沒有方法體,也就是沒有花括弧,直接分號結束,象這種方法我們叫抽象方法,必須使用關鍵字abstract定義
    例如:public abstract function fun();
  抽象類別:包含抽象方法的類必須是抽象類別也要使用關鍵字abstract加以聲明。(即使用關鍵字abstract 修飾的類為抽象類別
  抽象類別的特點:
    不能執行個體化,也就new成對象
    若想使用抽象類別,就必須定義一個類去繼承這個抽象類別,並定義覆蓋父類的抽象方法(實現抽象方法)。

  其實抽象類別對於子類(實作類別),有一個約束的作用。子類繼承一個抽象父類必須實現父類中的所有抽象方法(除非它也是一個抽象類別)
    注意:含有抽象方法的類肯定是抽象類別,但是不是所有的抽象類別都必須包含抽象方法。

 1 <?php 2     //抽象類別父類A 3     abstract class A 4     { 5         public function fun1()         6         { 7             echo "fun1()...<br/>"; 8         } 9         10         public function fun2()        11         {12             echo "fun2()...<br/>";13         }14         15         public abstract function fun3();    16         17         /**18          *求和方法19          * @param int $a 被求和參數120          * @param int $b 被求和參數221          * @return int 返回求和結果22          */23         public abstract function add($a,$b);    24         25     }26 27     class B extends A28     {29        public function fun3()        30         {31             echo "fun3()...<br/>";32         }33 34        public function add($x,$y)    //這就是約束:函數名必須是add,參數必須有兩個35        {36            return $x+$y;37        }38     }39 40     $b = new B();41     $b->fun1();42     $b->fun2();43     $b->fun3();44     echo $b->add(10,20);45 ?>

二、介面
  PHP與大多數物件導向程式設計語言一樣,不支援多重繼承,也就是說每個類只能繼承一個父類。為瞭解決這個這個問題,PHP引入了介面,介面的思想是指定了一個實現了該介面的類必須實現的一系列函數。
  介面:如果在一個抽象類別中包含的只有抽象方法,可以將其定義為interface(介面),用implements(實現)關鍵字使用它。
  定義格式:
    interface 介面名稱
    {
      //常量成員 (使用const關鍵字定義)
      //抽象方法 (不需要使用abstract關鍵字)
    }
  使用格式: class 類名 implements 介面名1,介面名2{ ... ... }

  當一個類在實現了一個介面後,它必須實現即覆蓋該介面的所有方法才可以執行個體化使用,否則即為抽象類別。

 1 <?php 2     //介面 3     interface A 4     { 5         public function fun1(); 6          7         public function fun2(); 8          9         public function fun3();10         11     }12 13     //定義了類B實現介面A14     abstract class B implements A15     {16        public function fun1()17        {18             echo "fun1()...<br/>";19        }20        public function fun2()21        {22             echo "fun2()...<br/>";23        }24        25     }26     class C extends B27     {28        public function fun3()29        {30             echo "fun3()...<br/>";31        }32     }33 34     $b = new C();35     $b->fun1();36     $b->fun2();37     $b->fun3();38 ?>

三、抽象類別與介面的區別
  定義:
    抽象類別表示該類中可能已經有一些方法的具體定義。
    介面就僅僅只能定義各個方法的介面,不能有具體的實現代碼在成員方法中。
  用法:
    抽象類別是子類用來繼承的,當父類已有實際功能的方法時,該方法在子類中可以不必實現。
    實現一個介面,必須實現介面中所有定義的方法,不能遺漏任何一個。
  理解: 介面就像公司老闆(每年定下一系列目標,不去做,只提出各種計劃)
      抽象類別就像公司各層級經理(配合老闆定下的計劃,實現一部分,分發一部分任務員工)
        最終繼承的類就是普通員工(接收經理分發的任務,按照要求,毫不遺漏的完成)
四、多態
  對象的多態性是指在父類中定義的屬性或行為被子類繼承之後,可以具有不同的資料類型或表現出不同的行為。這使得同一個屬性或行為在父類及其各個子類中具有不同的語義。
  為什麼要多態?
    多態可以使程式可擴充性更強,減少代碼更改量。
  實現多態的方法:繼承(重寫)、抽象、介面
  例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類,其"繪圖"方法功能不同。

 1 <?php 2     //多態 3     //主板上的PCI插槽介面 4     abstract class PCI 5     { 6         public abstract function start(); 7         public abstract function stop(); 8     } 9 10     //主板類11     class MainBoard12     {13         public function running(PCI $pci)14         {15             $pci->start();16             $pci->stop();17         }18     }19 20     //音效卡廠家21     class SoundCard extends PCI22     {23         public function start()24         {25             echo "音效卡啟動...<br/>";26         }27         28         public function stop()29         {30             echo "音效卡停止...<br/>";31         }32     }33 34     //網卡廠家35     class NetWorkCard extends PCI36     {37         public function start()38         {39             echo "網卡啟動...<br/>";40         }41         42         public function stop()43         {44             echo "網卡停止...<br/>";45         }46     }47 48 49     //使用:主程式50     $mb = new MainBoard();51     $sc = new SoundCard();52     $nc = new NetworkCard();53 54     $mb->running($sc);55     $mb->running($nc);56 ?>

 

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.