噠噠噠!這個也是重點,所以語言通用的。要理解並記住。今天講oop面向對象的重點:封裝,繼承,多態!

封裝

通過字面意思,我們知道封裝就是把東西弄在一起裝起來,我們生活中有很多例子,比如開車,我們一踩油門,汽車就會開始加速了,但是,具體汽車裏面是如何加速的,比如如何把油燃燒,產生動力,並能帶動輪子的。這裏面的具體邏輯我們是不清楚的,我們也沒必要清楚,因為這一些複雜的邏輯當時汽車工程師已經給封裝好了,只是給了我們一個油門的入口,我們只要知道踩油門,汽車能加速就行。如果想要讓汽車加速,我們還需要一個個操作汽油燃燒並轉換成動能的原理都操作一遍,那這世界上就沒有多少開車的了。編程也是這樣,有的很複雜的邏輯沒必要釋放出來,只需要釋放出來一個可供調用的入口就行,其他的具體邏輯封裝裏面就行!

繼承:

這個很好理解,每個新生兒都和父母的某些器官長的一樣,這就是基因的"繼承",也就是代碼中的子類有了父類的某些屬性和方法,且只有修飾符為public和protected的可以被繼承,private修飾的不可以被繼承,下一篇裏,我們會抽出一節專門來講這個"訪問權限"!

多態:

這塊就稍微有點難理解了,我們舉個例子吧,我們的電腦都有usb接口,當你在這個usb接口插上鼠標時,電腦會執行鼠標的行為,當你插入存儲卡時,會執行存儲卡的行為。代碼實現如下:

<?php
// 定義的一個Iusb接口
interface Iusb{
    public function usbDo();
}
// 定義一個鼠標類實現了Iusb接口
class MouseUsb implements Iusb{
    public function usbDo(){
        echo "我是鼠標的行為".PHP_EOL;
    }
}
// 定義一個存儲卡類實現了Iusb接口
class StorageUsb implements Iusb{
    public function usbDo(){
        echo "我是存儲卡的行為".PHP_EOL;
    }
}

// 定義一個電腦
class Computer{
  	// 電腦的execDoUsb方法,需要一個實現了Iusb接口的類的實例
    public function execDoUsb(Iusb $usb){
        $usb->usbDo();
    }
}
$mouse = new MouseUsb();
$storage = new StorageUsb();
$computer = new Computer();
$computer->execDoUsb($mouse);
$computer->execDoUsb($storage);
?>

以上會輸出如下內容:

我是鼠標的行為
我是存儲卡的行為

注:以上關鍵點在於電腦類的方法中的參數,execDoUsb(Iusb $usb),這裏的Iusb表示傳遞過來的對象,且這個對象的類是必須實現了Iusb接口的類,我們在調用時,分別使用了$computer->execDoUsb($mouse);鼠標類的對象;以及存儲卡類的對象$computer->execDoUsb($storage)。這就是多態的用法,我們如果不使用接口的話,必須要定義兩個方法,一個需要傳入MouseUsb對象,一個需要傳入StorageUsb對象,那樣一來增加了代碼量,二來不好理解。用接口寫是多麼優雅的事情啊!而且很多框架都是使用的接口來進行架構的!接口就是定義了一個參數的規範,只要符合這個規範的類的對象都可以傳遞到這個參數裏來,接口實現了類對象的向上轉換,雖然傳遞過來的是個具體的對象,但是,由於這個對象具備了接口的所有的方法,所以就可以傳遞到這個方法裏來進行調用!

接口那裏你可以使用一個抽象的usb類來寫,你可以嘗試一下!,記住:多態就是向上轉換,低一級的類型可以以參數中被轉換成上一級的類型,即對象的父類或者接口

警告:這個多態這裏是很重要的,很多架構的源碼,無論是php還是java都用到了接口,這也是為什麼我之前説的oop編程其實就是面向接口編程!