Download presentation
Presentation is loading. Please wait.
1
第13章 物件導向與例外處理 13-1 物件導向的基礎 13-2 類別與物件 13-3 類別的繼承 13-4 PHP的例外處理
13-5 物件導向介面的資料庫存取 13-6 應用實例:網路商店
2
13-1 物件導向的基礎 物件的基本觀念 物件導向程式語言
3
物件的基本觀念 – 說明 物件導向程式設計是一種更符合人性化的程式設計方法,因為我們本來就生活在物件世界,思考模式也遵循著物件導向的模式。 「物件」(Object)是物件導向技術的關鍵,以程式角度來說,物件是資料與此資料相關操作結合在一起的組合體,如下圖所示:
4
物件的基本觀念 - 特性 狀態(State):物件所有「屬性」(Attributes)目前的狀態值,屬性儲存物件的狀態,可以簡單的是布林值變數,也可能是另一個物件,例如:車子的車型、排氣量、色彩和自排或手排等屬性。 行為(Behavior):行為是物件可見部分提供的服務,可以作什麼事,例如:車子可以發動、停車、加速和換擋等。 識別字(Identity):識別字是用來識別不同的物件,每一個物件都擁有獨一無二的識別字,PHP語言是使用物件處理(Object Handles)的指標作為物件的識別字。
5
物件導向程式語言 - 說明 程式語言之所以稱為「物件導向程式語言」(Object-oriented Programming Language),主要是指程式語言支援三種特性: 封裝 繼承 多形
6
13-1-2 物件導向程式語言 - 封裝 封裝(Encapsulation)
封裝是將資料和處理資料的函數組合起來建立成物件。在PHP定義物件是使用「類別」(Class),屬於一種抽象資料型態,換句話說,就是替程式語言定義新的資料型態。
7
13-1-2 物件導向程式語言 - 繼承 繼承(Inheritance)
繼承是物件的再利用,當定義好類別後,其他類別可以繼承此類別的資料和方法,新增或取代繼承物件的資料和方法。
8
13-1-2 物件導向程式語言 - 多形 多形(Polymorphism)
多形屬於物件導向最複雜的特性,類別如果需要處理各種不同的資料型態,此時並不需要針對不同資料型態建立各別類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,也稱為「同名異式」。
9
13-2 類別與物件 13-2-1 宣告類別與建立物件 13-2-2 成員變數與方法的存取 13-2-3 建構子與解構子
使用物件的成員變數 類別常數與靜態成員
10
13-2 類別與物件 PHP類別是物件的原型或藍圖,可以用來建立物件,屬於使用者自行定義的資料型態。類別的組成元素有兩種,如下所示:
成員資料(Data Member):物件的資料部分,也就是PHP變數、常數或其他物件的「成員變數」(Member Variables),即物件「屬性」(Properties)的狀態值。 成員函數(Member Functions):物件處理資料的PHP函數,稱為「方法」(Methods),即物件的行為。
11
13-2-1 宣告類別與建立物件 – PHP的類別宣告
在PHP是使用class關鍵字來宣告類別。例如:產生網頁內容的BookView類別,如下所示: class BookView { var $id; var $title; var $price; var $page; function header() { … } function content() { … } function footer() { … } function getPage() { … } }
12
13-2-1 宣告類別與建立物件 – 使用類別建立物件
宣告類別與建立物件 – 使用類別建立物件 在PHP程式可以將類別視為資料型態,使用new運算子建立物件。例如:使用BookView類別建立物件,如下所示: $page = new BookView(); 程式碼建立名為$page的物件變數,其資料型態是PHP的Object物件,這是使用BookView類別為藍圖所建立的物件。不過,$page儲存的並不是物件本身,而是一個物件處理(Object Handles)的數值,類似函數的傳址呼叫,可以讓PHP程式找到真正的物件所在。
13
13-2-1 宣告類別與建立物件 – 存取物件的成員變數
宣告類別與建立物件 – 存取物件的成員變數 在PHP程式建立物件後,就可以在程式碼指定成員變數的值,如下所示: $page->id = "P697"; $page->title = "JSP網頁設計範例教本"; $page->price = 650;
14
13-2-1 宣告類別與建立物件 – 呼叫物件的成員方法
宣告類別與建立物件 – 呼叫物件的成員方法 PHP物件可以使用存取成員變數的相同方法來呼叫成員方法,如下所示: $page->header(); $page->content(); $page->footer(); echo $page->getPage();
15
13-2-2 成員變數與方法的存取 – 三種修飾子 private修飾子:成員變數或方法只能在類別本身呼叫或存取。
public修飾子:成員變數或方法是物件對外的使用介面,可以讓PHP程式碼呼叫物件的成員方法或存取成員變數。如果沒有使用修飾子,預設是public。例如:上一節BookView類別使用var宣告的成員變數或方法,都是public。 protected修飾子:成員變數或方法可以在類別本身和其子類別存取或呼叫,類別的子類別稱為繼承,詳細說明請參閱第13-3節。
16
13-2-2 成員變數與方法的存取 - 範例 例如:本節程式範例是修改自第13-2-1節的BookView類別,如下所示:
class BookView { var $id; public $title; public $price; protected $page; function header() { … } public function content() { … } private function bookInfo() { … } function footer() { … } function getPage() { … } }
17
13-2-2 成員變數與方法的存取 - 工具函數 bookInfo()函數宣告成private外,其他方法是類別的使用介面。
bookInfo()方法因為只提供給類別的成員方法content()呼叫,所以宣告成private,此種方法也稱為「工具函數」(Utility Functions)。
18
建構子與解構子 - 說明 類別建構子(Constructors)是物件的初始函數,在建立物件時會自動呼叫此函數來指定成員變數值、開啟資料庫連接或檔案等操作。 解構子(Destructors)對應建構子是物件的善後函數,在建立物件後,自動呼叫此函數來釋放佔用資源或處理一些善後工作。例如:關閉資料庫連接或寫入資料至記錄檔(Log File)。
19
建構子與解構子 – 統一的建構子方法 PHP類別擁有統一的建構子方法名稱__construct()。例如:BookView類別的建構子方法,如下所示: class BookView { ………… function __construct($id, $title, $price = 650) { echo "指定成員變數值...<br>"; $this->id = $id; $this->title = $title; $this->price = $price; }
20
建構子與解構子 – 統一的解構子方法 PHP類別統一的解構子方法名稱為__destruct()。例如:BookView類別的解構子方法,如下所示: class BookView { ………… function __destruct() { $fp = fopen("Ch13_2_3.html", "w"); echo "建立HTML檔案Ch13_2_3.html...<br/>"; if (fwrite($fp, $this->page)) echo "將網頁內容寫入HTML檔案成功...<br/>"; else echo "寫入HTML檔案失敗...<br/>"; fclose($fp); // 關閉檔案 }
21
使用物件的成員變數 PHP類別的成員變數還可以是其他物件的物件變數。例如:在BookView類別的宣告擁有Author物件,如下所示: class BookView { private $id; private $title; private $author; private $price; private $page; function __construct($id,$title,$author,$price=650) { $this->id = $id; $this->title = $title; $this->author = new Author($author); $this->price = $price; } ………… class Author { public $name; function __construct($name) { $this->name=$name; } }
22
類別常數與靜態成員 - 類別常數 在PHP類別宣告可以定義常數。例如:在Student類別宣告最大學生數的MAX_STUDNETS常數,如下所示: class Student { const MAX_STUDENTS = 50; ………… } 程式碼宣告類別常數MAX_STUDENTS,常數不用「$」符號。在PHP程式碼可以使用類別名稱Student和「::」運算子來取得常數值,如下所示: echo "最大學生數: ".Student::MAX_STUDENTS."<br/>";
23
13-2-5 類別常數與靜態成員 – 靜態成員變數與方法(宣告)
類別常數與靜態成員 – 靜態成員變數與方法(宣告) 在PHP類別宣告可以使用static宣告靜態成員的類別變數和方法。例如:在Student類別宣告類別變數$teacher、$count和類別方法numOfStudents(),如下所示: class Student { ………… public static $teacherNo = "CS1002"; private static $count = 0; static function numOfStudents() {return self::$count;} }
24
13-2-5 類別常數與靜態成員 – 靜態成員變數與方法(使用)
類別常數與靜態成員 – 靜態成員變數與方法(使用) 程式碼可以使用類別名稱Student和「::」運算子存取變數值和呼叫類別方法,如下所示: echo "指導老師編號: ".Student::$teacherNo."<br/><hr/>"; echo "<hr/>目前學生數: ".Student::numOfStudents()."<br/>"; 在類別宣告的成員方法存取類別的靜態成員時,需要使用self關鍵字來存取,如下所示: self::$count++; return self::$count;
25
13-3 類別的繼承 13-3-1 類別繼承的基礎 13-3-2 類別的繼承 13-3-3 覆寫父類別的成員方法
PHP的類別與物件函數
26
13-3 類別的繼承 「繼承」(Inheritance)是物件導向程式設計的進階觀念,繼承是一個類別直接繼承現存類別的部分或全部的成員資料和方法,並且新增額外的成員資料或方法,或是覆寫繼承類別的方法。
27
類別繼承的基礎 - 說明 類別如果是繼承自其他類別,我們稱此類別為繼承類別的「子類別」(Subclass)或「延伸類別」(Derived Class),繼承類別稱為「父類別」(Superclass)或「基礎類別」(Base Class),例如:類別Car是繼承自類別Vehicle,此時的繼承關係,如右圖所示:
28
類別繼承的基礎 - 兄弟類別 如果有多個子類別繼承同一個父類別,則每一個子類別稱為「兄弟類別」(Sibling Classes),如右圖所示:
29
類別的繼承 - 父類別 PHP的繼承只能有一個父類別,不支援多重繼承,即同時繼承多個父類別,繼承可以擴充現有類別的功能。例如:父類別Vehicle的宣告,如下所示: class Vehicle { private $no; function setNumber($no) { … } protected function showVehicle() { … } }
30
13-3-2 類別的繼承 - 子類別 以轎車Car子類別宣告為例,PHP可以使用extends關鍵字擴充父類別,如下所示:
class Car extends Vehicle { private $doors; function __construct($no, $doors = 4) { … } function showCar() { … } }
31
類別的繼承 - 呼叫父類別的成員函數 在子類別Car的建構子或成員方法可以呼叫父類別的成員方法,使用的是parent關鍵字,如下所示: parent::setNumber($no); 上述程式碼在「::」前是parent,表示呼叫父類別的成員方法,以此例是setNumber()成員方法。
32
覆寫父類別的成員方法 - 說明 在父類別的成員方法如果並不符合需求,我們可以在子類別宣告同名的成員方法來取代父類別的成員方法,稱為「覆寫」(Override)。
33
13-3-3 覆寫父類別的成員方法 - 父類別 例如:在Vehicle父類別擁有showVehicle()成員方法需要覆寫,如下所示:
class Vehicle { private $no; function __construct($no) { … } protected function showVehicle() { … } }
34
13-3-3 覆寫父類別的成員方法 - 子類別 子類別Car繼承父類別Vehicle,如下所示:
class Car extends Vehicle { private $doors; function __construct($no, $doors = 4) { … } function showVehicle() { … } }
35
13-3-3 覆寫父類別的成員方法 – 呼叫父類別的建構子
覆寫父類別的成員方法 – 呼叫父類別的建構子 因為父類別擁有__construct()建構子方法,如果子類別沒有建構子方法,就會自動呼叫父類別的建構子方法,在子類別可以使用parent關鍵字呼叫父類別的建構子,如下所示: parent::__construct($no);
36
13-3-4 PHP的類別與物件函數 函數 說明 class_exists(string)
檢查參數字串的類別名稱是否存在,存在傳回true;否則為false get_class($obj) 傳回參數物件的類別名稱 get_parent_class($obj) 傳回參數物件或類別字串的父類別名稱 get_object_vars($obj) 傳回參數物件成員變數的結合陣列,鍵值是變數名稱,元素值是變數值 get_class_methods(string) 傳回參數類別名稱字串的成員方法陣列 method_exists($obj,string) 檢查第1個參數物件是否有第2個參數的成員方法名稱,如果有,傳回true;否則為false is_subclass_of($obj,string) 檢查第1個參數物件是否是第2個參數類別名稱的子類別,如果是,傳回true;否則為false
37
13-4 PHP的例外處理 PHP的例外處理 繼承Exception類別
38
PHP的例外處理 - 說明 PHP的例外處理(Handling Exceptions)是一種流程控制的程式敘述,可以停止目前程式碼的執行,然後跳到指定區塊來處理錯誤。這些錯誤是一種例外物件(Exception),即在PHP程式執行期間,發生不正常執行狀態或錯誤時所產生的物件。
39
PHP的例外處理 - 產生例外物件 PHP內建的Exception類別可以建立例外物件,在PHP程式是使用throw指令丟出例外。例如:丟出Exception例外物件,如下所示: throw new Exception("密碼是空字串!"); 上述程式碼使用new運算子建立例外物件,建構子方法的第1個參數是例外說明字串,第2個參數是選項的數字錯誤碼。
40
13-4-1 PHP的例外處理 – 例外處理的程式敘述(架構)
PHP語言的例外處理程式敘述分成try和catch兩個程式區塊,可以處理特定例外物件,如下所示: try { ……… } catch ( Exception $e ) { // 例外處理 }
41
13-4-1 PHP的例外處理 – 例外處理的程式敘述(說明)
try程式區塊:在try區塊的程式碼檢查是否產生例外,當例外產生時,就丟出指定例外類型的物件。 catch程式區塊:在try程式區塊的程式碼如果丟出例外,PHP程式需要準備catch程式區塊來處理例外,傳入參數$e是例外物件,可以取得例外的相關資訊,如下所示: print "檔案: " . $e->getFile() . "<br/>"; print "行號: " . $e->getLine() . "<br/>"; print "錯誤訊息: " . $e->getMessage() . "<br/>";
42
繼承Exception類別 - 說明 PHP程式除了可以使用現成Exception類別建立例外物件外,也可以繼承Exception類別建立自訂的例外子類別,其主要目的如下所示: 在try/catch程式敘述可以區分不同錯誤產生的例外物件。 在子類別可以新增所需的成員方法。
43
13-4-2 繼承Exception類別 - 範例 例如:驗證密碼錯誤的ValidException例外類別宣告,如下所示:
class ValidException extends Exception { function getMyMessage() { print "檔案: ".$this->getFile()."<br/>"; print "行號: ".$this->getLine()."<br/>"; print "錯誤訊息: ".$this->getMessage()."<br/>"; }
44
13-5 物件導向介面的資料庫存取 13-5-1 使用物件導向介面的資料庫存取
使用Prepared Statement執行SQL指令
45
13-5-1 使用物件導向介面的資料庫存取 – 建立物件執行查詢
使用物件導向介面的資料庫存取 – 建立物件執行查詢 PHP的ext/mysqli擴充程式可以使用物件導向介面來存取資料庫,如下所示: $mysqli = new mysqli("localhost","root",""); 上述程式碼使用new運算子建立$mysqli物件。在成功建立$mysqli物件後,就可以呼叫物件的相關方法來存取資料庫,如下所示: $mysqli->select_db("myschool"); $result = $mysqli->query($sql);
46
13-5-1 使用物件導向介面的資料庫存取 – 取出記錄資料
使用物件導向介面的資料庫存取 – 取出記錄資料 在取得$result物件後,取出記錄資料是呼叫$result結果物件的方法和存取成員變數,如下所示: $total_fields = $result->field_count; $total_records = $result->num_rows; while( $row = $result->fetch_assoc() ){ echo $row["sno"]."-".$row["name"]."<br/>"; } $result->close();
47
13-5-1 使用物件導向介面的資料庫存取 – 關閉資料庫連接
使用物件導向介面的資料庫存取 – 關閉資料庫連接 最後呼叫$mysqli物件的close()方法關閉資料庫連接,如下所示: $mysqli->close();
48
13-5-2 使用Prepared Statement執行 SQL指令 – 建立SQL指令
PHP的ext/myqli擴充程式支援Prepared Statement,可以預先建立SQL指令字串,然後使用參數來指定欄位值,如下所示: $sql ="INSERT INTO students (sno, name, address, "; $sql.="birthday) VALUES (?,?,?,?)"; 上述SQL指令INSERT擁有4個「?」號,表示這些欄位值是參數,尚未指定其值。
49
13-5-2 使用Prepared Statement執行 SQL指令 – 建立物件和對應變數值
接著可以呼叫mysqli_prepere()函數建立Prepared Statement物件$stmt,如下所示: $stmt = mysqli_prepare($link, $sql); 在建立$stmt物件後,就可以呼叫bind_param()方法,將參數對應到指定的變數值,如下所示: $stmt->bind_param("ssss",$sno,$name,$address, $birthday);
50
13-5-2 使用Prepared Statement執行 SQL指令 – 建立物件和指定變數值
$sno = $_POST["Sno"]; $name = $_POST["Name"]; $address = $_POST["Address"]; $birthday = $_POST["Birthday"];
51
13-5-2 使用Prepared Statement執行 SQL指令 – 執行SQL指令和關閉物件
現在我們已經建立完整SQL指令,可以呼叫$stmt物件的execute()方法執行SQL指令,如下所示: $stmt->execute(); echo "資料庫新增記錄成功, 影響記錄數: ". $stmt->affected_rows . "<br/>"; 最後需要呼叫close()方法關閉$stmt物件,如下所示: $stmt->close();
52
13-6 應用實例:網路商店 網路商店的程式架構 網路商店的使用 網路商店的程式說明
53
13-6 應用實例:網路商店 網路商店是一家銷售商品的虛擬店面,網路商店和一般商店一樣都是開店作生意,只不過是開在不同舞台,網路商店沒有實際店面,只是模擬現實生活的方式來採購商品,將選購商品放入購物車。
54
網路商店的程式架構 – 架構 網路商店是使用books資料表儲存圖書產品資料,網路商店購物車是直接使用WebForceCartCookies元件來實作,以物件儲存選購的商品資料,其架構如下圖所示:
55
13-6-1 網路商店的程式架構 – 資料庫 網路商店的MySQL資料庫【shop】擁有資料表books,其資料表欄位如下所示:
欄位名稱 MySQL資料類型 大小 欄位說明 bookid VARCHAR 6 書號(主鍵) booktitle 50 書名 bookauthor 10 作者 bookprice DOUBLE N/A 書價
56
網路商店的使用 – 首頁 網路商店在執行前請參考第10-5-2節執行shop.sql建立shop資料庫。接著啟動Internet Explorer執行PHP程式shop.php的網址:
57
13-6-2 網路商店的使用 – 選購商品和檢視購物車
網路商店的使用 – 選購商品和檢視購物車 在商品清單的【數量】欄位輸入購買數量,按【訂購】鈕,就可以將商品放入購物車。 按下方【檢視購物車內容】超連結,可以看到目前選購的商品清單、小計和總價,如下圖所示:
58
網路商店的使用 – 刪除選購商品 在購物車表格前按【刪除】超連結,就可以刪除選購商品。
59
網路商店的程式說明 網路商店應用實例共有5個PHP程式檔案,wfcart.php是WebForceCartCookies元件的類別檔,dataAccess.php是物件導向介面的資料庫存取類別。shop.sql可以建立shop資料庫。 PHP程式:shop.php 使用表格顯示銷售商品,和提供選購商品的表單欄位,商品內容是books資料表的記錄資料。 PHP程式:shoppingcart.php 網路商店購物車,這是呼叫wfCart物件的方法來一一取出選購的商品。 PHP程式:delete.php 刪除購物車中選購的商品,即呼叫del_item()方法。
60
End
Similar presentations