php之抽象類

定義

抽象類: 無法實例化
類前加 abstract, 此類就成爲抽象類,無法實例化.

引出概念

春秋戰國時期,燕零七 飛行器專家,能工巧匠.

他寫了一份圖紙—飛行器製造術

飛行器祕製圖譜
1: 要有一個有力的發動機,噴氣式.
2: 要有一個平衡舵,掌握平衡

他的孫子問: 發動機怎麼造呢?
燕零七眼望夕陽: 我是造不出來,但我相信後代有人造出來


燕零七的構想,當時的科技造不出來,即這個類只能在圖紙化,無法實例化.
此時這個類沒有具體的方法去實現,還太抽象,因此我們把他做成一個抽象類。
代碼

第一代

abstract class FlyIdea {
    // 大力引擎,當時也沒法做,這個方法也實現不了
    // 因此方法也是抽象的
    public abstract function engine();

    // 平衡舵
    public abstract function blance();
    /*
        注意:抽象方法 不能有方法體
        下面這樣寫是錯誤的
        public abstract function blance() {
        }
        Fatal error: Abstract function FlyIdea::engine() cannot contain body
    */
}

//  抽象類不能 new 來實例化
//  下面這行是錯誤的
//  $kongke = new FlyIdea();
//  Cannot instantiate abstract class FlyIdea

第二代

到了明朝,萬戶用火箭解決了發動機的問題

abstract class Rocket extends FlyIdea {

    // 萬戶把engine方法,給實現了,不再抽象了
    public function engine() {
        echo '點燃火藥,失去平衡,嘭!<br />';
    }

    // 但是萬戶實現不了平衡舵,
    // 因此平衡舵對於Rocket類來說,
    // 還是抽象的,
    // 類也是抽象的
}

第三代

到了現代,燕十八親自制作飛行器
這個Fly類中,所以抽象方法,都已經實現了,不再是夢想.

class Fly extends Rocket{
    public function engine() {
        echo '有力一扔<br />';
    }

    public function blance() {
        echo '兩個紙翼保持平衡~~~';
    }

    public function start() {
        $this->engine();
        for($i=0;$i<10;$i++) {
            $this->blance();
            echo '平穩飛行<br />';
        }
    }
}
$apache = new Fly();
$apache->start();

抽象類不能實例化,那要抽象類幹什麼?

abstract class Car {
    public function run() {
        echo '滴滴';
    }
}
class qq extends Car {
}
$qq = new qq();
//雖然不能直接實例化,但是我們可以先繼承,然後再實例化

抽象類使用場景

請看如下場景:
Facebook 多國語言歡迎頁面

user登陸,有一個 c 字段,是其國家
當各國人登陸時,看到各國語言的歡迎界面


我們可以用面向過程的來做

if($c == 'china') {
    echo '你好,非死不可';
} else if($c =='english') {
    echo 'hi,welcome';
} else if($c == 'japan') {
    echo '搜達斯內';
}

反思: 當facebook進入泰國市場時,
增加 else if ,擴展性很差




$c = 'english';

if($c == 'china') {
    echo '你好,非死不可';
} else if($c =='english') {
    echo 'hi,welcome';
} else if($c == 'japan') {
    echo '搜達斯內';
}

***/


// =====用面向對象來做======//
/*
讓美國小組/中國開發組/斯蜜達開發組 來開發Welcome類

爭執不下: echo 到底該中? 日? 韓?

說: 乾脆在wel()方法裏,判斷一下? 沒意義啊

*/

abstract class Welcome {
    public abstract function wel();
}



// 這是首頁的controller開發者
//$wel = new Welcome();
//$wel->wel();
/*
說:你們別爭執了,我只知道,我要調用wel()方法,就是打招呼,
你們顯示什麼語言和我無關.
*/


/**
經理說話:
Welcome誰也不許動,各國開發小組開發自己的招呼類

另:爲了首頁的controller開發者便於調用,
統一繼承自welcome類
**/



class china extends Welcome {
    public function wel() {
        echo '你好,非死不可,<br />';
    }
}


class english extends Welcome {
    public function wel() {
        echo 'hi,welcome';
    }
}


class japan extends Welcome {
    public function wel() {
        echo '搜達斯奈';
    }
}





// 再看首頁開發者

$c = 'english'; // china, japan
$wel = new $c();
$wel->wel();


/*

以後新增了泰國語,首頁的開發者,根本無需改動
只需要增加一個泰國的welcome類 就可以了.

所以有一些面向對象的介紹中,說面向對象的一個特點:可插拔特性

面向對象編程,能添加就不要修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章