《【精品课件】物件导向程式设计.ppt》由会员分享,可在线阅读,更多相关《【精品课件】物件导向程式设计.ppt(57页珍藏版)》请在三一办公上搜索。
1、第7章 物件導向程式設計,7-1 物件導向的基礎7-2 類別與物件7-3 類別的繼承7-4 抽象與常數類別7-5 PHP的介面7-6 多型的實作7-7 PHP的類別與物件函數,7-1 物件導向的基礎,7-1-1 物件的基本觀念7-1-2 物件導向程式語言,7-1 物件導向的基礎,PHP 5是一種真正支援物件導向程式設計OOP(Object-oriented Programming)的程式語言,物件導向程式設計是一種更符合人性化的程式設計的方法,因為我們本來就是生活在一個物件的世界,思考模式也遵循著物件導向的模式。,7-1-1 物件的基本觀念-說明,物件(Object)是物件導向技術的關鍵,以程
2、式的角度來說,物件是資料與相關函數結合在一起的組合體,如下圖所示:,7-1-1 物件的基本觀念-特點,狀態(State):物件所有屬性(Attributes)目前的狀態值,屬性是儲存物件狀態,可以簡單的是布林值變數,也可能是另一個物件,例如:車子的車型、排氣量、色彩和自排或手排等屬性。行為(Behavior):行為是物件可見部分提供的服務,可以作什麼事,例如:車子可以發動、停車、加速和換擋等。識別字(Identity):識別字是用來識別不同的物件,每一個物件都擁有獨一無二的識別字,PHP語言是使用物件處理(Object Handles)的指標作為物件的識別字。,7-1-2 物件導向程式語言-說
3、明,一種程式語言之所以稱為物件導向程式語言(Object-oriented Language),主要是指程式語言支援三種特性:封裝繼承多形,7-1-2 物件導向程式語言-封裝,封裝(Encapsulation)封裝是將資料和處理資料的函數組合起來建立成物件。在PHP定義物件是使用類別(Class),它屬於一種抽象資料型態,換句話說,就是替程式語言定義新的資料型態。,7-1-2 物件導向程式語言-繼承,繼承(Inheritance)繼承是物件的再利用,當定義好一個類別後,其他類別就可以繼承這個類別的資料和方法,新增或取代繼承物件的資料和方法。,7-1-2 物件導向程式語言-多形,多形(Polym
4、orphism)多形屬於物件導向最複雜的特性,類別如果需要處理各種不同的資料型態,此時並不需要針對不同的資料型態建立各別的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,也稱為同名異式。,7-2 類別與物件,7-2-1 宣告類別與建立物件7-2-2 成員變數與方法的存取7-2-3 建構子與解構子7-2-4 使用物件的成員變數7-2-5 類別常數與靜態成員,7-2 類別與物件,PHP的類別是物件的原型或藍圖,可以用來建立物件,屬於使用者自行定義的資料型態。類別的組成元素有兩種,如下所示:成員資料(Data Member):物件的資料部分,
5、也就是PHP變數、常數或其他物件的成員變數(Member Variables),這是物件屬性(Properties)的狀態值。成員函數(Member Functions):物件處理資料的PHP函數,稱為方法(Methods),這是物件的行為。,7-2-1 宣告類別與建立物件-PHP的類別宣告,在PHP是使用class關鍵字來宣告類別。例如:產生網頁內容的BookView類別,如下所示:class BookView var$id;var$title;var$price;var$page;function header()function content()function footer()fun
6、ction getPage(),7-2-1 宣告類別與建立物件-存取成員資料,在PHP類別宣告中存取成員變數需要使用this關鍵字加上-運算子來存取,如下所示:$this-page=;$this-page.=宣告類別與建立物件;$this-page.=;請注意!上述成員資料的this-符號前有$,所以之後只有變數名稱,而不需要$符號。,7-2-1 宣告類別與建立物件-使用類別建立物件,在PHP程式可以將類別視為資料型態,使用new運算子來建立物件。例如:使用BookView類別建立物件,如下所示:$page=new BookView();$page物件變數的資料型態是PHP的Object物件,
7、這是使用BookView類別為藍圖建立的物件。$page儲存的並不是物件本身,而是一個物件處理(Object Handles)的數值,類似函數的傳址呼叫,可以讓PHP程式找到真正物件的參考資料。,7-2-1 宣告類別與建立物件-物件實例,在PHP程式中使用類別建立的每一個物件稱為實例(Instances),同一個類別能夠建立多個物件,每一個物件是類別的一個物件實例,所以每一個實例都可以存取自己的成員變數,或是呼叫成員方法。,7-2-1 宣告類別與建立物件-存取物件的成員變數,在PHP程式建立物件後,就可以在程式碼指定成員變數的值,如下所示:$page-id=P697;$page-title=J
8、SP 2.0網頁設計範例教本;$page-price=650;上述程式碼的$page物件變數是使用-運算子指定成員變數值,請注意!在成員變數前並沒有$符號。,7-2-1 宣告類別與建立物件-呼叫物件的成員方法,在PHP建立的物件可以使用相同方法呼叫成員方法,如下所示:$page-header();$page-content();$page-footer();echo$page-getPage();上述程式碼呼叫BookView類別的成員方法,最後一個方法有傳回值。,7-2-2 成員變數與方法的存取-三種修飾子,private修飾子:成員變數或方法只能在類別本身呼叫或存取。public修飾子:成
9、員變數或方法是此類別建立物件對外的使用介面,可以讓PHP程式碼呼叫物件的成員方法或存取成員變數。如果沒有使用修飾子,預設是public。例如:上一節BookView類別使用var宣告的成員變數或方法,都是public。protected修飾子:成員變數或方法可以在類別本身和其子類別存取或呼叫,類別的子類別稱為繼承,詳細的說明請參閱第7-3節。,7-2-2 成員變數與方法的存取-範例,class BookView var$id;public$title;public$price;protected$page;function header()public function content()pr
10、ivate function bookInfo()function footer()function getPage(),7-2-2 成員變數與方法的存取-工具函數,bookInfo()函數宣告成private外,其他方法是類別的使用介面。bookInfo()方法因為只提供給類別的成員方法content()呼叫,所以宣告成private,這種方法也稱為工具函數(Utility Functions)。,7-2-3 建構子與解構子-說明,類別的建構子(Constructors)是物件的初始函數,在建立物件時會自動呼叫此函數來指定成員變數值、開啟資料庫連結或檔案等操作。解構子(Destructors
11、)對應建構子是物件的善後函數,在建立物件後,自動呼叫此函數來釋放佔用資源或處理一些善後工作。例如:關閉資料庫連結或寫入資料至記錄檔(Log File)。,7-2-3 建構子與解構子-統一的建構子方法_construct(),class BookView function _construct($id,$title,$price=650)echo 指定成員變數值.;$this-id=$id;$this-title=$title;$this-price=$price;,7-2-3 建構子與解構子-統一的解構子方法_destruct(),class BookView function _destru
12、ct()$fp=fopen(Ch7-2-3.htm,w);echo.;if(fwrite($fp,$this-page)echo.;else echo 寫入HTML檔案失敗.;fclose($fp);/關閉檔案,7-2-4 使用物件的成員變數,PHP類別的成員變數可以使用其他物件的物件變數,如下所示:class BookView private$author;function _construct(.)$this-author=new Author($author);,class Author,7-2-5 類別常數與靜態成員-類別常數,在PHP的類別宣告可以定義常數。例如:在Student類別
13、宣告最大學生數的MAX_STUDNETS常數,如下所示:class Student const MAX_STUDENTS=50;程式碼宣告類別常數MAX_STUDENTS,常數不用$符號。程式碼使用類別名稱Student和:運算子來取得常數值,如下所示:echo 最大學生數:.Student:MAX_STUDENTS.;,7-2-5 類別常數與靜態成員-靜態成員變數與方法(宣告),在PHP的類別宣告可以使用static宣告類別變數和方法。例如:宣告類別變數$teacher、$count和類別方法numOfStudents(),如下所示:class Student public static$t
14、eacherNo=CS1002;private static$count=0;static function numOfStudents()return self:$count;,7-2-5 類別常數與靜態成員-靜態成員變數與方法(使用),在程式碼可以使用類別名稱Student和:運算子存取變數值和呼叫類別方法,如下所示:echo 指導老師編號:.Student:$teacherNo.;echo 目前學生數:.Student:numOfStudents().;在類別宣告的成員方法存取類別的靜態成員時,需要使用self關鍵字來存取,如下所示:self:$count+;return self:$c
15、ount;,7-3 類別的繼承,7-3-1 類別繼承的基礎7-3-2 類別的繼承7-3-3 覆寫父類別的成員方法,7-3 類別的繼承,繼承(Inheritance)是物件導向程式設計的進階觀念,繼承是一個類別直接繼承現存類別的部分或全部的成員資料和方法,並且新增額外的成員資料或方法,甚至覆寫繼承類別的方法。,7-3-1 類別繼承的基礎-說明,類別如果是繼承自其他類別,我們稱此類別為繼承類別的子類別(Subclass)或延伸類別(Derived Class),繼承的類別稱為父類別(Superclass)或基礎類別(Base Class),例如:類別Car是繼承自類別Vehicle,此時的繼承關係
16、,如右圖所示:,7-3-1 類別繼承的基礎-兄弟類別,如果有多個子類別繼承同一個父類別,每一個子類別稱為兄弟類別(Sibling Classes),如下圖所示:,7-3-2 類別的繼承-父類別,PHP的繼承並不支援多重繼承,也就是只能有一個父類別,而不能有多個父類別,繼承可以擴充現有類別的功能。例如:父類別Vehicle的宣告,如下所示:class Vehicle private$no;function setNumber($no)protected function showVehicle(),7-3-2 類別的繼承-子類別,以轎車Car子類別宣告為例,PHP可以使用extends關鍵字擴充
17、父類別,如下所示:class Car extends Vehicle private$doors;function _construct($no,$doors=4)function showCar(),7-3-2 類別的繼承-呼叫父類別的成員函數,在子類別Car的建構子或成員方法可以呼叫父類別的成員方法,使用的是parent關鍵字,如下所示:parent:setNumber($no);上述程式碼在:前是parent,表示呼叫父類別的成員方法,以此例是setNumber()成員方法。,7-3-3 覆寫父類別的成員方法-說明,在父類別的成員方法如果並不符合需求,我們可以在子類別宣告同名的成員方法來
18、取代父類別的成員方法,稱為覆寫(Override)。,7-3-3 覆寫父類別的成員方法-父類別,例如:在父類別Vehicle擁有showVehicle()成員方法需要覆寫,如下所示:class Vehicle private$no;function _construct($no)protected function showVehicle(),7-3-3 覆寫父類別的成員方法-子類別,子類別Car繼承父類別Vehicle,如下所示:class Car extends Vehicle private$doors;function _construct($no,$doors=4)function
19、showVehicle(),7-3-3 覆寫父類別的成員方法-呼叫父類別的建構子,因為父類別擁有_construct()建構子方法,如果子類別沒有建構子方法,就會自動呼叫父類別的建構子方法,在子類別可以使用parent關鍵字呼叫父類別的建構子,如下所示:parent:_construct($no);,7-4 抽象與常數類別,7-4-1 抽象類別與抽象方法7-4-2 常數類別與常數方法,7-4-1 抽象類別與抽象方法-說明,PHP類別宣告成abstract表示是抽象類別,抽象類別並不能建立物件,只能繼承抽象類別宣告子類別。在抽象類別可以使用abstract宣告方法為抽象方法,表示方法只是原型宣告
20、,其實作的程式碼是位在子類別,而且繼承的子類別一定要實作這些抽象方法。,7-4-1 抽象類別與抽象方法-宣告抽象類別,例如:在PHP程式宣告抽象類別Shape,如下所示:abstract class Shape public$x;public$y;abstract function area();上述Shape類別定義點(Point)座標$x和$y,並且提供抽象方法area()計算形狀的面積,但是並沒有方法的程式碼區塊。,7-4-1 抽象類別與抽象方法-繼承抽象類別,接著宣告Circle子類別繼承Shape類別,如下所示:class Circle extends Shape public$r;
21、function _construct($x,$y,$r)/成員方法:實作抽象方法area()function area()return 3.1416*$this-r*$this-r;,7-4-2 常數類別與常數方法-常數類別,PHP的類別如果宣告成final,表示類別不能被繼承,如果方法宣告成final表示方法不可以覆寫。例如:繼承父類別Member的CarMember類別,如下所示:final class CarMember extends Member,7-4-2 常數類別與常數方法-常數方法,在Member類別的方法是宣告成final,如下所示:class Member final f
22、unction isLogon()return$this-status;final function setStatus($s)$this-status=$s;,7-5 PHP的介面-說明,PHP語言的介面(Interface)是在類別繼承架構中定義類別的行為,在介面宣告的方法是一種抽象方法,實作介面的類別需要實作所有抽象方法,如下所示:interface AreaInterface abstract function area();,7-5 PHP的介面-範例,例如:宣告Circle類別繼承Shape類別且實作AreaInterface介面,如下所示:class Circle extends
23、 Shape implements AreaInterface public$r;function _construct($x,$y,$r)function area()return 3.1416*$this-r*$this-r;,7-6 多型的實作,7-6-1 類別繼承實作多形7-6-2 PHP介面實作多形,7-6 多型的實作-說明,多形(Ploymorphism)是物件導向程式設計重要且複雜的觀念,它可以讓應用程式更容易擴充,一個同名方法,就可以處理不同資料型態的物件,產生不同的操作。物件導向程式語言實作多形可以分成兩種方式,如下所示:類別繼承的成員方法覆寫PHP介面的成員方法實作,7-6
24、 多型的實作-實作方式,類別繼承的成員方法覆寫:繼承基礎類別覆寫同名的成員方法來處理不同資料型態的物件,如果有新的資料型態,即物件,只需新增繼承的子類別和覆寫成員方法。PHP介面的成員方法實作:PHP的介面是指同一個物件擁有多種型態,換個角度,不同物件可以擁有相同的介面型態,所以一樣可以透過介面來實作多型。,7-6-1 類別繼承實作多形-抽象類別宣告,多形是物件導向技術中最複雜的觀念,在這一節筆者準備使用類別繼承的覆寫來實作多形,這是使用抽象類別繼承的多形實例。例如:Shape抽象類別,其類別宣告如下所示:abstract class Shape public$x;public$y;abstr
25、act function area();,7-6-1 類別繼承實作多形-繼承抽象類別,class Circle extends Shape function area()return 3.1416*$this-r*$this-r;class Rectangle extends Shape function area()return$this-height*$this-width;,7-6-1 類別繼承實作多形-建立多形方法1,因為PHP的Object資料型態的變數可以指定成不同的物件參考,所以我們可以宣告$obj物件變數來參考Circle或Rectangle物件,如下所示:$obj=$c;if
26、($obj instanceof Circle)echo 圖面積:;echo$obj-area().;上述$obj物件變數是參考Circle物件,可以使用instanceof運算子判斷物件變數是哪一種物件,然後呼叫$obj-area()方法取得圓形的面積。,7-6-1 類別繼承實作多形-建立多形方法2,同樣的,當物件變數$obj是Rectangle物件時,我們仍然可以呼叫相同的$obj-area()方法取得長方形面積。兩種物件呼叫方法的程式碼相同,只是結果不同,這個area()方法稱為多形,也就是同名異式。,7-6-2 PHP介面實作多形-介面宣告,多形也可以使用實作介面方法來建立多形方法。例
27、如:IArea介面,其介面宣告如下所示:interface IArea function area();,7-6-2 PHP介面實作多形-實作IArea介面,class Circle implements IArea function area()return 3.1416*$this-r*$this-r;class Rectangle implements IArea function area()return$this-height*$this-width;,7-6-2 PHP介面實作多形-建立多形方法,兩個類別都實作area()方法,只是內含程式碼不同,可以分別計算不同圖形的面積。如同第7-6-1節,我們一樣可以將物件變數$obj指定成Circle或Rectangle物件,然後使用相同的$obj-area()程式碼呼叫來計算圖形面積,換句話說,area()方法就是多形。,7-7 PHP的類別與物件函數,