您好,登錄后才能下訂單哦!
本篇內容主要講解“PHP中的抽象類與接口的定義”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP中的抽象類與接口的定義”吧!
在面向對象開發中,特別是使用現代化框架的過程中,我們經常會和接口、抽象類打交道。特別是我們自己嘗試去封裝一些功能時,接口和抽象類往往會是我們開始的第一步,但你真的了解它們嗎?
抽象類的特點:
顧名思義,它是抽象的,當然也就是不能被實例化的。所以,抽象類一般是作為我們的基類來進行定義的。
在一個類中,只要有一個方法被定義為抽象的,那么這個類就必須加上abstract關鍵字成為抽象類。
被定義為抽象的方法只聲明其調用方式,不能定義其具體的功能實現。
子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須和父類一致或者更為寬松。
方法的調用方式必須匹配,即類型和所需參數數量必須一致。子類實現的抽象方法可以增加參數但必須有默認值。
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);
接口的特點:
可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。
就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
接口中定義的所有方法都必須是公有,這是接口的特性。
類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱。
類要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤
接口也可以繼承,通過使用 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();
從上面我們可以總結出一些抽象類和接口的區別:
抽象類的子類遵循繼承原則,只能有一個父類;但一個類可以實現多個接口
抽象類中可以有非抽象的已經實現的方法;接口中全是抽象的方法,都是方法定義
抽象類中方法和變量的訪問控制自己定義;接口中只能是公共的
那么問題來了,這兩貨哪個好?抱歉,這個問題可沒有答案,它們的作用不同。抽象類可以作為基類,為子類提供公共方法,并定制公共的抽象讓子類來實現。而接口則是更高層次的抽象,它可以讓我們依賴于抽象而不是具體的實現,為軟件開發帶來更多的擴展性。
接口,實際上也可以看做是一種契約。我們經常會拿電腦主機箱后面的插口來說明。比如USB接口,我們定義了它的大小,里面的線路格式,不管你插進來的是什么,我們都可以連通。而具體的實現則是取決于電腦軟件對插入的硬件的解釋,比如U盤就會去讀取它里面的內容,而鍵盤則會識別為一個外設。
從這里可以看出,接口能夠為我們程序的擴展提供非常強大的支撐。任何面向對象語言中接口都是非常重要的特性。下面我們來用接口模擬剛剛說的USB插口。
interface USB{ function run(); }class Keyboard implements USB{ function run(){ echo "這是鍵盤"; } }class UDisk implements USB{ function run(){ echo "這是U盤"; } }
這么寫有什么好處呢?我們再深入一個概念:依賴注入。如果使用面向接口開發的話:
function testUSB (USB $u){ $u->run(); }// 插入U盤testUSB(new UDisk);// 插入鍵盤testUSB(new Keyboard);
testUSB方法中的$u并不是某個具體實例,只是USB接口的抽象,在不知道它是什么實例的情況下我們通過接口契約,保證它一定會有一個run()方法。而具體的實現,則是在外部我們調用方法的時候注入進來的。
到此,相信大家對“PHP中的抽象類與接口的定義”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。