小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

玩轉(zhuǎn)PHP中的抽象類與接口

 硬核項(xiàng)目經(jīng)理 2021-05-31

玩轉(zhuǎn)PHP中的抽象類與接口

在面向?qū)ο箝_(kāi)發(fā)中,特別是使用現(xiàn)代化框架的過(guò)程中,我們經(jīng)常會(huì)和接口、抽象類打交道。特別是我們自己嘗試去封裝一些功能時(shí),接口和抽象類往往會(huì)是我們開(kāi)始的第一步,但你真的了解它們嗎?

抽象類定義

抽象類的特點(diǎn):

  • 顧名思義,它是抽象的,當(dāng)然也就是不能被實(shí)例化的。所以,抽象類一般是作為我們的基類來(lái)進(jìn)行定義的。
  • 在一個(gè)類中,只要有一個(gè)方法被定義為抽象的,那么這個(gè)類就必須加上abstract關(guān)鍵字成為抽象類。
  • 被定義為抽象的方法只聲明其調(diào)用方式,不能定義其具體的功能實(shí)現(xiàn)。
  • 子類必須定義父類中的所有抽象方法,這些方法的訪問(wèn)控制必須和父類一致或者更為寬松。
  • 方法的調(diào)用方式必須匹配,即類型和所需參數(shù)數(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);

接口定義

接口的特點(diǎn):

  • 可以指定某個(gè)類必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。
  • 就像定義一個(gè)標(biāo)準(zhǔn)的類一樣,但其中定義所有的方法都是空的。
  • 接口中定義的所有方法都必須是公有,這是接口的特性。
  • 類中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤。類可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來(lái)分隔多個(gè)接口的名稱。
  • 類要實(shí)現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會(huì)導(dǎo)致致命錯(cuò)誤
  • 接口也可以繼承,通過(guò)使用 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ū)別:

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

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

面向接口開(kāi)發(fā)

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

從這里可以看出,接口能夠?yàn)槲覀兂绦虻臄U(kuò)展提供非常強(qiáng)大的支撐。任何面向?qū)ο笳Z(yǔ)言中接口都是非常重要的特性。下面我們來(lái)用接口模擬剛剛說(shuō)的USB插口。

interface USB{
function run();
}

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

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

這么寫有什么好處呢?我們?cè)偕钊胍粋€(gè)概念:依賴注入。如果使用面向接口開(kāi)發(fā)的話:

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

// 插入U(xiǎn)盤
testUSB(new UDisk);

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

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

總結(jié)

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

測(cè)試代碼: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./manual/zh/language.oop5.abstract.phphttps://www./manual/zh/language.oop5.interfaces.phphttps://www./manual/zh/language.oop5.interfaces.php#79110

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多