成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PHP中的抽象類與接口詳細(xì)介紹

這篇文章主要介紹“PHP中的抽象類與接口詳細(xì)介紹”,在日常操作中,相信很多人在PHP中的抽象類與接口詳細(xì)介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中的抽象類與接口詳細(xì)介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、達孜ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的達孜網(wǎng)站制作公司


 
抽象類定義

抽象類的特點:

  • 顧名思義,它是抽象的,當(dāng)然也就是不能被實例化的。所以,抽象類一般是作為我們的基類來進行定義的。
  • 在一個類中,只要有一個方法被定義為抽象的,那么這個類就必須加上abstract關(guān)鍵字成為抽象類。
  • 被定義為抽象的方法只聲明其調(diào)用方式,不能定義其具體的功能實現(xiàn)。
  • 子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須和父類一致或者更為寬松。
  • 方法的調(diào)用方式必須匹配,即類型和所需參數(shù)數(shù)量必須一致。子類實現(xiàn)的抽象方法可以增加參數(shù)但必須有默認(rèn)值。
abstract class A {
   public function show(){
       $this->getName();
       echo PHP_EOL;
   }

   protected abstract function getName();
   public abstract function getAge($age);
}

class ChildA1 extends A {
   public function getName(){
       echo "I'm ChildA1";
   }
   public function getAge($age){
       echo "Age is " . $age;
   }
}

class ChildA2 extends A {
   protected function getName(){
       echo "I'm ChildA2";
   }
   public function getAge($age, $year = ''){
       echo "Age is ". $age . ', bron ' . $year;
   }
}

$ca1 = new ChildA1();
$ca1->show();
$ca1->getAge(18);

$ca2 = new ChildA2();
$ca2->show();
$ca2->getAge(20, 2000);
   
接口定義

接口的特點:

  • 可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。
  • 就像定義一個標(biāo)準(zhǔn)的類一樣,但其中定義所有的方法都是空的。
  • 接口中定義的所有方法都必須是公有,這是接口的特性。
  • 類中必須實現(xiàn)接口中定義的所有方法,否則會報一個致命錯誤。類可以實現(xiàn)多個接口,用逗號來分隔多個接口的名稱。
  • 類要實現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會導(dǎo)致致命錯誤
  • 接口也可以繼承,通過使用 extends 操作符
  • 接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋
interface B1 {
   const B1_NAME = 'Interface B1';
   function getName();
   function getAge($age);
}

interface B2 extends B1 {
   function show();
}

interface B3 {
   function getSchool();
}

class ChildB implements B2, B3{
   function getName(){
       echo "I'm ChildB";
   }
   function getAge($age, $year = ''){
       echo "Age is " . $age;
   }
   function show(){
       $this->getName();
       echo PHP_EOL;

       $this->getAge(23, 1997);
       echo PHP_EOL;

       echo self::B1_NAME;
       echo PHP_EOL;
   }
   
   function getSchool(){
       echo "study in Peking University";
       echo PHP_EOL;
   }
}

$b = new ChildB();
$b->show();
$b->getSchool();
   
抽象類和接口的區(qū)別

從上面我們可以總結(jié)出一些抽象類和接口的區(qū)別:

  • 抽象類的子類遵循繼承原則,只能有一個父類;但一個類可以實現(xiàn)多個接口
  • 抽象類中可以有非抽象的已經(jīng)實現(xiàn)的方法;接口中全是抽象的方法,都是方法定義
  • 抽象類中方法和變量的訪問控制自己定義;接口中只能是公共的

那么問題來了,這兩貨哪個好?抱歉,這個問題可沒有答案,它們的作用不同。抽象類可以作為基類,為子類提供公共方法,并定制公共的抽象讓子類來實現(xiàn)。而接口則是更高層次的抽象,它可以讓我們依賴于抽象而不是具體的實現(xiàn),為軟件開發(fā)帶來更多的擴展性。

 
面向接口開發(fā)

接口,實際上也可以看做是一種契約。我們經(jīng)常會拿電腦主機箱后面的插口來說明。比如USB接口,我們定義了它的大小,里面的線路格式,不管你插進來的是什么,我們都可以連通。而具體的實現(xiàn)則是取決于電腦軟件對插入的硬件的解釋,比如U盤就會去讀取它里面的內(nèi)容,而鍵盤則會識別為一個外設(shè)。

從這里可以看出,接口能夠為我們程序的擴展提供非常強大的支撐。任何面向?qū)ο笳Z言中接口都是非常重要的特性。下面我們來用接口模擬剛剛說的USB插口。

interface USB{
   function run();
}

class Keyboard implements USB{
   function run(){
       echo "這是鍵盤";
   }
}

class UDisk implements USB{
   function run(){
       echo "這是U盤";
   }
}
 

這么寫有什么好處呢?我們再深入一個概念:依賴注入。如果使用面向接口開發(fā)的話:

function testUSB (USB $u){
   $u->run();
}

// 插入U盤
testUSB(new UDisk);

// 插入鍵盤
testUSB(new Keyboard);
 

testUSB方法中的$u并不是某個具體實例,只是USB接口的抽象,在不知道它是什么實例的情況下我們通過接口契約,保證它一定會有一個run()方法。而具體的實現(xiàn),則是在外部我們調(diào)用方法的時候注入進來的。

 

總結(jié)

掌握好接口的設(shè)計原則,往往就能看懂一大半的框架的設(shè)計思想。這也是我們面向?qū)ο笾凶钭罨A(chǔ)的特性。抽象類作為公共基類來說可以為多態(tài)提供比較好的范本,它能夠讓你的子類有自己的個性又能使用父類的能力。總之,深入場景業(yè)務(wù),選擇合適的方式實現(xiàn)代碼,靠的是能力、經(jīng)驗與智慧的綜合,決不是一句誰好誰不好所能定性的。

測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/%E7%8E%A9%E8%BD%ACPHP%E4%B8%AD%E7%9A%84%E6%8A%BD%E8%B1%A1%E7%B1%BB%E4%B8%8E%E6%8E%A5%E5%8F%A3.php

參考文檔:https://www.php.net/manual/zh/language.oop5.abstract.phphttps://www.php.net/manual/zh/language.oop5.interfaces.phphttps://www.php.net/manual/zh/language.oop5.interfaces.php#79110

到此,關(guān)于“PHP中的抽象類與接口詳細(xì)介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當(dāng)前題目:PHP中的抽象類與接口詳細(xì)介紹
鏈接分享:http://jinyejixie.com/article10/gphhgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、手機網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)域名注冊、定制開發(fā)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
温州市| 都昌县| 旅游| 穆棱市| 宣恩县| 镶黄旗| 新乐市| 焉耆| 简阳市| 东兰县| 固镇县| 固阳县| 汕尾市| 双鸭山市| 静乐县| 桃江县| 兰坪| 凤阳县| 黔西县| 察哈| 庆安县| 禹州市| 从化市| 钦州市| 巴南区| 绵竹市| 会东县| 雅安市| 和平县| 宜章县| 奉新县| 庐江县| 大城县| 沁水县| 察隅县| 平果县| 海城市| 教育| 鹤山市| 饶河县| 小金县|