在《PHP從入門到精通視訊教學課程中,PHP(外文名稱:PHP: Hypertext Preprocessor,中文名稱:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。 PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的程式語言相比,PHP是將程式嵌入到HTML(標準通用標記語言下的一個應用)文件中去執行,執行效率比完全產生HTML標記的CGI要高許多; PHP還可以執行編譯後程式碼,編譯可以達到加密和最佳化程式碼運行,使程式碼運行更快。
課程播放網址:http://www.php.cn/course/351.html
該老師講課風格:
講課親切自然,樸實無華,沒有矯揉造作,也不刻意渲染,而是婁娓而談,細細道來,師生之間在一種平等、協作、和諧的氣氛下,進行默默的情感交流,將對知識的渴望和探索融於簡樸、真實的教學情景之中,學生在靜靜的思考、默默的首肯中獲得知識
本影片中較為困難是物件導向程式設計三大功能了:
#一、封裝
封裝從字面上來理解就是包裝的意思,專業點就是資訊隱藏,是指利用抽象資料類型將資料和基於資料的操作封裝在一起,使其構成一個不可分割的獨立實體,資料被保護在抽象資料類型的內部,盡可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯繫。系統的其他物件只能透過包裹在資料外面的已經授權的操作來與這個封裝的物件進行交流和互動。也就是說使用者是無需知道物件內部的細節,但可以透過該物件對外的提供的介面來存取該物件。
對於封裝而言,一個物件它所封裝的是自己的屬性和方法,所以它是不需要依賴其他物件就可以完成自己的操作。使用封裝有三大好處:
1、良好的封裝能夠減少耦合。
2、類別內部的結構可以自由修改。
3、可以對成員進行更精確的控制。
4、隱藏訊息,實作細節。
封裝把一個物件的屬性私有化,同時提供一些可以被外在存取的屬性的方法,如果不想被外在方法,我們大可不必提供方法給外在存取。但是如果一個類別沒有提供給外界存取的方法,那麼這個類別就沒有什麼意義了。
public class Husband { /* * 对属性的封装 * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 */ private String name ; private String sex ; private int age ; private Wife wife; /* * setter()、getter()是该对象对外开发的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void setWife(Wife wife) { this.wife = wife; } }
封裝可以使我們輕鬆修改類別的內部實現,而無需修改使用了該類別的客戶程式碼。就可以對成員變數進行更精確的控制。
1. public void setAge(int age) { 2. if(age > 120){ 3. System.out.println("ERROR:error age input...."); //提示错误信息 4. }else{ 5. this.age = age; 6. } 7. }
. public String getSexName() { 2. if("0".equals(sex)){ 3. sexName = "女"; 4. } 5. else if("1".equals(sex)){ 6. sexName = "男"; 7. } 8. else{ 9. sexName = "人妖"; 10. } 11. return sexName; 12. }
二、繼承
2.1 繼承綜述
繼承是使用已存在的類別的定義作為基礎建立新類別的技術,新類別的定義可以增加新的資料或新的功能,也可以用父類別的功能,但不能選擇性地繼承父類別。透過使用繼承我們能夠非常方便地複用以前的程式碼,能夠大大的提高開發的效率。
繼承所描述的是“is-a”的關係,如果有兩個物件A和B,若可以描述為“A是B”,則可以表示A繼承B,其中B是被繼承者稱之為父類別或超類,A是繼承者稱為子類別或衍生類別。
其實繼承者是被繼承者的特殊化,它除了擁有被繼承者的特質外,還擁有自己獨有得特徵。例如貓有抓老鼠、爬樹等其他動物沒有的特性。同時在繼承關係中,繼承者完全可以替換被繼承者,反之則不可以,例如我們可以說貓是動物,但不能說動物是貓就是這個道理,其實對於這個我們將其稱之為“向上轉型」。
誠然,繼承定義了類別如何相互關聯,共享特性。對於若干個相同或相識的類,我們可以抽像出他們共有的行為或屬相並將其定義成一個父類或超類,然後用這些類繼承該父類,他們不僅可以擁有父類的屬性、方法也可以定義自己獨有的屬性或方法。
同時在使用繼承時需要記住三句話:
1、子類別擁有父類別非private的屬性與方法。
2、子類別可以擁有自己屬性和方法,也就是子類別可以對父類別進行擴充。
3、子類別可以用自己的方式實作父類別的方法。 (以後介紹)。
學習繼承一定少不了這三個東西:建構器、protected關鍵字、向上轉換
2.2 建構器
透過前面我們知道子類別可以繼承父類別的屬性和方法,除了那些private的外還有一樣是子類別繼承不了的---建構器。對於構造器而言,它只能夠被調用,而不能被繼承。 呼叫父類別的建構方法我們使用super()即可。
建構過程是從父類別「向外」擴散的,也就是從父類別開始往子類別一級一級地完成建構。而且我們沒有顯示的引用父類別的建構器,這就是Java的聰明之處:編譯器會預設給子類別呼叫父類別的建構器。
但是,這個預設呼叫父類別的建構器是有前提的:父類別有預設建構器。如果父類別沒有預設建構器,我們就要必須顯示的使用super()來呼叫父類別建構器,否則編譯器會報錯:無法找到符合父類別形式的建構器。
對於子類別而已,其建構器的正確初始化是非常重要的,而且當且僅當只有一個方法可以保證這一點:在構造器中調用父類構造器來完成初始化,而父類別構造器具有執行父類別初始化所需的所有知識和能力。
對於繼承而言,子類別會預設呼叫父類別的建構器,但是如果沒有預設的父類別建構器,子類別必須要顯示的指定父類別的建構器,而且必須是在子類別構造器中做的第一件事(第一行程式碼)。
2.3 protected關鍵字
private存取修飾符,對於封裝而言,是最好的選擇,但這個只是基於理想的世界,有時候我們需要這樣的需求:我們需要將某些事物盡可能地對這個世界隱藏,但是仍然允許子類別的成員來存取它們。這時候就需要使用到protected。
對於protected而言,它指明就類用戶而言,他是private,但是對於任何繼承與此類的子類而言或者其他任何位於同一個包的類而言,他卻是可以訪問的。
2.4 向轉型
在上面的繼承中我們談到繼承是is-a的相互關係,貓繼承與動物,所以我們可以說貓是動物,或者說貓是動物的一種。這樣將貓看做動物就是向上轉型。
三、多態
3.1 多態性綜述
所謂多態是指程式中定義的引用變數所指向的特定型別與經由此引用變項所發出的方法呼叫在程式設計時並不確定,而是在程式運行期間才確定,即一個引用變數倒底會指向哪個類別的實例對象,該引用變數發出的方法呼叫到底是哪個類別中實現的方法,必須在由程式運行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改原始程式碼,就可以讓引用變數綁定到各種不同的類別實作上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式碼就可以改變程式執行時所綁定的具體程式碼,讓程式可以選擇多個運行狀態,這就是多態性。
所以對於多態我們可以總結如下:
指向子類別的父類別引用由於向上轉型了,它只能存取父類別中擁有的方法和屬性,而對於子類中存在而父類別中不存在的方法,該引用是不能使用的,儘管是重載該方法。若子類別重寫了父類別中的某些方法,在呼叫該些方法的時候,必定是使用子類別中定義的這些方法(動態連線、動態呼叫)。
對於物件導向而言,多態分為編譯時多型和執行時多型。其中編輯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的函數,透過編輯之後會變成兩個不同的函數,在運行時談不上多態。而運行時多態是動態的,它是透過動態綁定來實現的,也就是我們所說的多態性。
3.2 多態的實作條件
在剛開始就提到了繼承在為多態的實作做了準備。子類Child繼承父類Father,我們可以寫一個指向子類的父類類型引用,該引用既可以處理父類Father對象,也可以處理子類Child對象,當相同的消息發送給子類或父類物件時,該物件就會根據自己所屬的引用而執行不同的行為,這就是多態。即多態性就是相同的訊息使得不同的類別做出不同的回應。
Java實現多型態有三個必要條件:繼承、重寫、向上轉型。
繼承:多型態中必須存在有繼承關係的子類別和父類別。
重寫:子類別對父類別中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類別的方法。
向上轉換:在多型態中需要將子類別的參考賦給父類別對象,只有這樣該引用才能夠具備技能呼叫父類別的方法和子類別的方法。
只有滿足了上述三個條件,我們才能夠在同一個繼承結構中使用統一的邏輯實作程式碼處理不同的對象,從而達到執行不同的行為。
對Java而言,它多型的實作機制遵循一個原則:當超類別物件引用變數引用子類別物件時,被引用物件的類型而不是引用變數的類型決定了呼叫誰的成員方法,但是這個被呼叫的方法必須是在超類別中定義過的,也就是說被子類別覆蓋的方法。
3.3 實作形式
在Java中有兩種形式可以實現多態:繼承和介面。
3.2.1、基於繼承實作的多型別
以繼承為基礎的實作機制主要表現在父類別和繼承該父類別的一個或多個子類別對某些方法的重寫,多個子類別對同一方法的重寫可以表現出不同的行為。
基於繼承實現的多態可以總結如下:對於引用子類的父類類型,在處理該引用時,它適用於繼承該父類的所有子類,子類對象的不同,對方法的實作也就不同,執行相同動作所產生的行為也就不同。
如果父類別是抽象類,那麼子類別必須要實作父類別中所有的抽象方法,這樣該父類別所有的子類別一定存在統一的對外接口,但其內部的具體實作可以各異。這樣我們就可以使用頂層類別提供的統一介面來處理該層次的方法。
3.2.2、基於介面實現的多態
繼承是透過重寫父類別的相同方法的幾個不同子類別來體現的,那麼就可就是透過實作介面並覆蓋介面中同一方法的幾個不同的類別體現的。
在介面的多態中,指向介面的參考必須是指定這實作了該介面的一個類別的實例程序,在執行時,根據物件所引用的實際類型來執行對應的方法。
繼承都是單繼承,只能為一組相關的類別提供一致的服務介面。但是介面可以是多繼承多實現,它能夠利用一組相關或不相關的介面進行組合與擴充,能夠對外提供一致的服務介面。所以它相對於繼承有更好的靈活性。
以上是php從入門到精通影片教學的資源推薦的詳細內容。更多資訊請關注PHP中文網其他相關文章!