收藏 分享(赏)

【精品课件】物件导向程式设计.ppt

上传人:无敌 文档编号:1376245 上传时间:2018-07-07 格式:PPT 页数:58 大小:304.50KB
下载 相关 举报
【精品课件】物件导向程式设计.ppt_第1页
第1页 / 共58页
【精品课件】物件导向程式设计.ppt_第2页
第2页 / 共58页
【精品课件】物件导向程式设计.ppt_第3页
第3页 / 共58页
【精品课件】物件导向程式设计.ppt_第4页
第4页 / 共58页
【精品课件】物件导向程式设计.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

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 f

6、ooter() function getPage() ,7-2-1 宣告類別與建立物件-存取成員資料,在PHP類別宣告中存取成員變數需要使用this關鍵字加上-運算子來存取,如下所示:$this-page = ;$this-page .= 宣告類別與建立物件;$this-page .= ;請注意!上述成員資料的this-符號前有$,所以之後只有變數名稱,而不需要$符號。,7-2-1 宣告類別與建立物件-使用類別建立物件,在PHP程式可以將類別視為資料型態,使用new運算子來建立物件。例如:使用BookView類別建立物件,如下所示:$page = new BookView();$page物件變

7、數的資料型態是PHP的Object物件,這是使用BookView類別為藍圖建立的物件。$page儲存的並不是物件本身,而是一個物件處理(Object Handles)的數值,類似函數的傳址呼叫,可以讓PHP程式找到真正物件的參考資料。,7-2-1 宣告類別與建立物件-物件實例,在PHP程式中使用類別建立的每一個物件稱為實例(Instances),同一個類別能夠建立多個物件,每一個物件是類別的一個物件實例,所以每一個實例都可以存取自己的成員變數,或是呼叫成員方法。,7-2-1 宣告類別與建立物件-存取物件的成員變數,在PHP程式建立物件後,就可以在程式碼指定成員變數的值,如下所示:$page-i

8、d=P697;$page-title=JSP 2.0網頁設計範例教本;$page-price=650;上述程式碼的$page物件變數是使用-運算子指定成員變數值,請注意!在成員變數前並沒有$符號。,7-2-1 宣告類別與建立物件-呼叫物件的成員方法,在PHP建立的物件可以使用相同方法呼叫成員方法,如下所示:$page-header();$page-content();$page-footer();echo $page-getPage();上述程式碼呼叫BookView類別的成員方法,最後一個方法有傳回值。,7-2-2 成員變數與方法的存取-三種修飾子,private修飾子:成員變數或方法只能在

9、類別本身呼叫或存取。public修飾子:成員變數或方法是此類別建立物件對外的使用介面,可以讓PHP程式碼呼叫物件的成員方法或存取成員變數。如果沒有使用修飾子,預設是public。例如:上一節BookView類別使用var宣告的成員變數或方法,都是public。protected修飾子:成員變數或方法可以在類別本身和其子類別存取或呼叫,類別的子類別稱為繼承,詳細的說明請參閱第7-3節。,7-2-2 成員變數與方法的存取-範例,class BookView var $id; public $title; public $price; protected $page; function header

10、() public function content() private function bookInfo() function footer() function getPage() ,7-2-2 成員變數與方法的存取-工具函數,bookInfo()函數宣告成private外,其他方法是類別的使用介面。bookInfo()方法因為只提供給類別的成員方法content()呼叫,所以宣告成private,這種方法也稱為工具函數(Utility Functions)。,7-2-3 建構子與解構子-說明,類別的建構子(Constructors)是物件的初始函數,在建立物件時會自動呼叫此函數來指定成

11、員變數值、開啟資料庫連結或檔案等操作。解構子(Destructors)對應建構子是物件的善後函數,在建立物件後,自動呼叫此函數來釋放佔用資源或處理一些善後工作。例如:關閉資料庫連結或寫入資料至記錄檔(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 建構子與解構子-統一

12、的解構子方法_destruct(),class BookView function _destruct() $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($au

13、thor); ,class Author ,7-2-5 類別常數與靜態成員-類別常數,在PHP的類別宣告可以定義常數。例如:在Student類別宣告最大學生數的MAX_STUDNETS常數,如下所示:class Student const MAX_STUDENTS = 50; 程式碼宣告類別常數MAX_STUDENTS,常數不用$符號。程式碼使用類別名稱Student和:運算子來取得常數值,如下所示:echo 最大學生數: .Student:MAX_STUDENTS.;,7-2-5 類別常數與靜態成員-靜態成員變數與方法(宣告),在PHP的類別宣告可以使用static宣告類別變數和方法。例如:

14、宣告類別變數$teacher、$count和類別方法numOfStudents(),如下所示:class Student public static $teacherNo = CS1002; private static $count = 0; static function numOfStudents() return self:$count; ,7-2-5 類別常數與靜態成員-靜態成員變數與方法(使用),在程式碼可以使用類別名稱Student和:運算子存取變數值和呼叫類別方法,如下所示:echo 指導老師編號: .Student:$teacherNo.;echo 目前學生數: .Stude

15、nt:numOfStudents().;在類別宣告的成員方法存取類別的靜態成員時,需要使用self關鍵字來存取,如下所示:self:$count+;return self:$count;,7-3 類別的繼承,7-3-1 類別繼承的基礎7-3-2 類別的繼承7-3-3 覆寫父類別的成員方法,7-3 類別的繼承,繼承(Inheritance)是物件導向程式設計的進階觀念,繼承是一個類別直接繼承現存類別的部分或全部的成員資料和方法,並且新增額外的成員資料或方法,甚至覆寫繼承類別的方法。,7-3-1 類別繼承的基礎-說明,類別如果是繼承自其他類別,我們稱此類別為繼承類別的子類別(Subclass)或延

16、伸類別(Derived Class),繼承的類別稱為父類別(Superclass)或基礎類別(Base Class),例如:類別Car是繼承自類別Vehicle,此時的繼承關係,如右圖所示:,7-3-1 類別繼承的基礎-兄弟類別,如果有多個子類別繼承同一個父類別,每一個子類別稱為兄弟類別(Sibling Classes),如下圖所示:,7-3-2 類別的繼承-父類別,PHP的繼承並不支援多重繼承,也就是只能有一個父類別,而不能有多個父類別,繼承可以擴充現有類別的功能。例如:父類別Vehicle的宣告,如下所示:class Vehicle private $no; function setNum

17、ber($no) protected function showVehicle() ,7-3-2 類別的繼承-子類別,以轎車Car子類別宣告為例,PHP可以使用extends關鍵字擴充父類別,如下所示:class Car extends Vehicle private $doors; function _construct($no, $doors = 4) function showCar() ,7-3-2 類別的繼承-呼叫父類別的成員函數,在子類別Car的建構子或成員方法可以呼叫父類別的成員方法,使用的是parent關鍵字,如下所示:parent:setNumber($no);上述程式碼在:

18、前是parent,表示呼叫父類別的成員方法,以此例是setNumber()成員方法。,7-3-3 覆寫父類別的成員方法-說明,在父類別的成員方法如果並不符合需求,我們可以在子類別宣告同名的成員方法來取代父類別的成員方法,稱為覆寫(Override)。,7-3-3 覆寫父類別的成員方法-父類別,例如:在父類別Vehicle擁有showVehicle()成員方法需要覆寫,如下所示:class Vehicle private $no; function _construct($no) protected function showVehicle() ,7-3-3 覆寫父類別的成員方法-子類別,子類別

19、Car繼承父類別Vehicle,如下所示:class Car extends Vehicle private $doors; function _construct($no, $doors = 4) function showVehicle() ,7-3-3 覆寫父類別的成員方法-呼叫父類別的建構子,因為父類別擁有_construct()建構子方法,如果子類別沒有建構子方法,就會自動呼叫父類別的建構子方法,在子類別可以使用parent關鍵字呼叫父類別的建構子,如下所示:parent:_construct($no);,7-4 抽象與常數類別,7-4-1 抽象類別與抽象方法7-4-2 常數類別與常

20、數方法,7-4-1 抽象類別與抽象方法-說明,PHP類別宣告成abstract表示是抽象類別,抽象類別並不能建立物件,只能繼承抽象類別宣告子類別。在抽象類別可以使用abstract宣告方法為抽象方法,表示方法只是原型宣告,其實作的程式碼是位在子類別,而且繼承的子類別一定要實作這些抽象方法。,7-4-1 抽象類別與抽象方法-宣告抽象類別,例如:在PHP程式宣告抽象類別Shape,如下所示:abstract class Shape public $x; public $y; abstract function area();上述Shape類別定義點(Point)座標$x和$y,並且提供抽象方法ar

21、ea()計算形狀的面積,但是並沒有方法的程式碼區塊。,7-4-1 抽象類別與抽象方法-繼承抽象類別,接著宣告Circle子類別繼承Shape類別,如下所示:class Circle extends Shape public $r; function _construct($x, $y, $r) / 成員方法: 實作抽象方法area() function area() return 3.1416*$this-r*$this-r; ,7-4-2 常數類別與常數方法-常數類別,PHP的類別如果宣告成final,表示類別不能被繼承,如果方法宣告成final表示方法不可以覆寫。例如:繼承父類別Membe

22、r的CarMember類別,如下所示:final class CarMember extends Member ,7-4-2 常數類別與常數方法-常數方法,在Member類別的方法是宣告成final,如下所示:class Member final function isLogon() return $this-status; final function setStatus($s) $this-status=$s; ,7-5 PHP的介面-說明,PHP語言的介面(Interface)是在類別繼承架構中定義類別的行為,在介面宣告的方法是一種抽象方法,實作介面的類別需要實作所有抽象方法,如下所示:

23、interface AreaInterface abstract function area();,7-5 PHP的介面-範例,例如:宣告Circle類別繼承Shape類別且實作AreaInterface介面,如下所示:class Circle extends 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 多型的

24、實作-說明,多形(Ploymorphism)是物件導向程式設計重要且複雜的觀念,它可以讓應用程式更容易擴充,一個同名方法,就可以處理不同資料型態的物件,產生不同的操作。物件導向程式語言實作多形可以分成兩種方式,如下所示:類別繼承的成員方法覆寫PHP介面的成員方法實作,7-6 多型的實作-實作方式,類別繼承的成員方法覆寫:繼承基礎類別覆寫同名的成員方法來處理不同資料型態的物件,如果有新的資料型態,即物件,只需新增繼承的子類別和覆寫成員方法。PHP介面的成員方法實作:PHP的介面是指同一個物件擁有多種型態,換個角度,不同物件可以擁有相同的介面型態,所以一樣可以透過介面來實作多型。,7-6-1 類別

25、繼承實作多形-抽象類別宣告,多形是物件導向技術中最複雜的觀念,在這一節筆者準備使用類別繼承的覆寫來實作多形,這是使用抽象類別繼承的多形實例。例如:Shape抽象類別,其類別宣告如下所示:abstract class Shape public $x; public $y; abstract function area();,7-6-1 類別繼承實作多形-繼承抽象類別,class Circle extends Shape function area() return 3.1416*$this-r*$this-r; class Rectangle extends Shape function are

26、a() return $this-height*$this-width; ,7-6-1 類別繼承實作多形-建立多形方法1,因為PHP的Object資料型態的變數可以指定成不同的物件參考,所以我們可以宣告$obj物件變數來參考Circle或Rectangle物件,如下所示:$obj = $c;if ($obj instanceof Circle) echo 圖面積 : ;echo $obj-area() . ;上述$obj物件變數是參考Circle物件,可以使用instanceof運算子判斷物件變數是哪一種物件,然後呼叫$obj-area()方法取得圓形的面積。,7-6-1 類別繼承實作多形-建

27、立多形方法2,同樣的,當物件變數$obj是Rectangle物件時,我們仍然可以呼叫相同的$obj-area()方法取得長方形面積。兩種物件呼叫方法的程式碼相同,只是結果不同,這個area()方法稱為多形,也就是同名異式。,7-6-2 PHP介面實作多形-介面宣告,多形也可以使用實作介面方法來建立多形方法。例如:IArea介面,其介面宣告如下所示:interface IArea function area();,7-6-2 PHP介面實作多形-實作IArea介面,class Circle implements IArea function area() return 3.1416*$this-

28、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的類別與物件函數,pOXLp7v0djZKylHSJr3WxBmHK6NJ2G

29、hiBeFZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGshLs50cLmTWN60eo8Wgqv7XAv2OHUm32WGeaUwYDIAWGMeR4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGZ7R4I30kA1DkaGtgKQcWA3PtGZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGshLs50cLmTWN60eo8Wgqv7XAv2OHUm32WGeaUwYDIAWGMeR4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGshLs50cLmTWN60eo8Wgqv7XAv2OHUm32WGeaUwYDIAWGMes02GshLs50cLmTWN60eo8Wgqv7XAv2OHUm32WGeaUwYDIAWGMes02dLPqafkFGlzcvv2YiRQYHbhR8AI1LKULh3xvjDzkEAMGr8xbwF1bH1oIM30E7xp,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报