Presentation is loading. Please wait.

Presentation is loading. Please wait.

大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)

Similar presentations


Presentation on theme: "大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)"— Presentation transcript:

1 大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
PHP 網頁程式設計 PHP 網頁程式設計 第7章 物件與類別 大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)

2 outline 物件導向基礎 類別與物件 類別的繼承 PHP的類別與物件函數

3 7-1-1 物件的基本觀念 從程式的角度來說物件:物件是資料與相關函數結合在一起的組合體 方法 變數 黑盒子

4 7-1-1 物件的基本觀念 物件 物件擁有兩種特性 車子、電視、書桌、貓、狗…. 狀態(Sate):描述物件的特點,如:車型、排氣量、色彩
行為(Behavior):物件可以做的事,如:發動、停車、加速、換擋

5 7-1-2 物件導向程式語言 物件導向程式語言需支援 封裝(Encapsulation) 繼承(Inheritance)
將資料(屬性)與操作此資料的函數(方法)包在一起的特性 繼承(Inheritance) 繼承所有父類別所有屬性方法,並可以加以改變的特性 多型(Polymorphism) 繼承同類別建立同名方法處理不同的資料型態,方法名稱相同但程式碼不同同名異式

6 outline 物件導向基礎 類別與物件 類別的繼承 PHP的類別與物件函數

7 7-2 類別與物件 成員資料:物件資料部份 PHP變數=常數=屬性 成員函數:物件的行為 類別組成元素 PHP函數=方法 實體 原型、藍圖
建立 成員資料:物件資料部份 PHP變數=常數=屬性 成員函數:物件的行為 PHP函數=方法 類別組成元素

8 7-2-1宣告類別與建立類別 <!-- 程式範例:Ch7-2-1.php --> <html>
<head> <title>宣告類別與建立物件</title> <? // 宣告Time類別 class Time { var $seconds; // 成員變數 var $minutes; var $hours; // 成員函數 function printTime() { echo $this->hours . ":". $this->minutes .":". $this->seconds . "<br>"; } ?> </head> <body> // 建立物件 $now = new Time(); $lasttime = new Time(); $now->hours = 9; // 存取成員變數 $now->minutes = 45; $now->seconds = 20; $lasttime->hours = 16; // 存取成員變數 $lasttime->minutes = 36; $lasttime->seconds = 3; // 呼叫成員函數 echo "現在時間: "; $now->printTime(); echo "上次時間: "; $lasttime->printTime(); </body> </html> 宣告類別後才能建立物件 1.用『 class 』關鍵字來宣告類別 2.用『 var 』關鍵字來宣告成員資料 3.在類別宣告中存取成員變數使用『this->』 運算子來求解,之後變數名稱不需加$ 4.用『 new』運算子來建立物件 使用類別建立的每一個物件稱為『副本(Instances)』 一各類別可以建立多個物件

9 7-2-2成員資料的存取 PHP的類別宣告可以將成員資料透過成員函數進行存取 成員資料會被類別隱藏起來→資料隱藏

10 7-2-2成員資料的存取 <!-- 程式範例:Ch7-2-2.php --> <html> <head>
<title>成員資料的存取</title> <? // 宣告Time類別 class Time { var $seconds; // 成員變數 var $minutes; var $hours; // 成員函數 function printTime() { echo $this->hours . ":". $this->minutes .":". $this->seconds . "<br>"; } function validTime($s, $m, $h) { // 檢查時間資料是否在範圍內 if ($s < 0 || $s > 60) return false; if ($m < 0 || $m > 60) return false; if ($h < 0 || $h > 24) return false; // 不在範圍內 return true; // 合法時間資料 function setTime($s, $m, $h) { // 檢查時間參數是否合法 if ($this->validTime($s, $m, $h) ) { $this->seconds = $s; // 設定秒 $this->minutes = $m; // 設定分 $this->hours = $h; // 設定時 return true; } else return false; ?> </head> <body> <? // 建立物件 $now = new Time(); $lasttime = new Time(); // 呼叫成員函數 $now->setTime(20, 45, 9); $lasttime->setTime(3, 36, 16); echo "現在時間: "; $now->printTime(); echo "上次時間: "; $lasttime->printTime(); ?> </body> </html>

11 $bool = Time::validTime(17, 7, 20);
7-2-3類別與成員函數的使用 類別使用介面的習慣用法 設定資料的函數以set為字頭 讀取資料的函數以get為字頭 沒有建立物件的類別呼叫方式使用『::』 $bool = Time::validTime(17, 7, 20);

12 <!-- 程式範例:Ch7-2-3.php -->
<html> <head> <title>類別與成員函數的使用</title> <? // 宣告Time類別 class Time { var $seconds; // 成員變數 var $minutes; var $hours; // 成員函數 function getSeconds(){ return $this->seconds; } function getMinutes(){ return $this->minutes; } function getHours(){ return $this->hours; } function printTime() { echo $this->hours . ":". $this->minutes .":". $this->seconds . "<br>"; } function validTime($s, $m, $h) { // 檢查時間資料是否在範圍內 if ($s < 0 || $s > 60) return false; if ($m < 0 || $m > 60) return false; if ($h < 0 || $h > 24) return false; // 不在範圍內 return true; // 合法時間資料 function setTime($s, $m, $h) { // 檢查時間參數是否合法 if ($this->validTime($s, $m, $h) ) { $this->seconds = $s; // 設定秒 $this->minutes = $m; // 設定分 $this->hours = $h; // 設定時 return true; } else return false; ?> </head> <body> <? // 建立物件 $now = new Time(); $lasttime = new Time(); // 呼叫成員函數 $now->setTime(20, 45, 9); $lasttime->setTime(3, 36, 16); echo "現在時間: "; $now->printTime(); echo "上次時間: "; $lasttime->printTime(); // 取得時間資料 $seconds = $lasttime->getSeconds(); $minutes = $lasttime->getMinutes(); $hours = $lasttime->getHours(); // 顯示時,分和秒 echo $hours . "-" . $minutes . "-" . $seconds . "<br>"; // 呼叫類別方法 $bool = Time::validTime(17, 7, 20); echo "時間 20:7:17 是否合法: [" . $bool . "]<br>"; ?> </body> </html>

13 7-2-4類別建構子 類別建構子是物件的初始函數,在建立物件時會自動呼叫此函數 建構子與類別同名

14 <!-- 程式範例:Ch7-2-4.php -->
<html> <head> <title>類別的建構子</title> <? // 宣告Time類別 class Time { var $seconds; // 成員變數 var $minutes; var $hours; // 建構子 function Time($s=0, $m=0, $h=12) { // 檢查時間參數是否合法 if ($this->validTime($s, $m, $h) ) { $this->seconds = $s; // 設定秒 $this->minutes = $m; // 設定分 $this->hours = $h; // 設定時 } else { $this->seconds = 0; // 設定秒 $this->minutes = 0; // 設定分 $this->hours = 12; // 設定時 } // 成員函數 function getSeconds(){ return $this->seconds; } function getMinutes(){ return $this->minutes; } function getHours(){ return $this->hours; } function printTime() { echo $this->hours . ":". $this->minutes .":". $this->seconds . "<br>"; function validTime($s, $m, $h) { // 檢查時間資料是否在範圍內 if ($s < 0 || $s > 60) return false; if ($m < 0 || $m > 60) return false; if ($h < 0 || $h > 24) return false; // 不在範圍內 return true; // 合法時間資料 ?> </head> <body> <? // 建立物件 $now = new Time(20, 45, 9); $lasttime = new Time(3, 36, 16); // 呼叫成員函數 echo "現在時間: "; $now->printTime(); // 取得時間資料 $seconds = $lasttime->getSeconds(); $minutes = $lasttime->getMinutes(); $hours = $lasttime->getHours(); // 顯示時,分和秒 echo "上次時間: "; echo $hours . "-" . $minutes . "-" . $seconds . "<br>"; ?> </body> </html>

15 outline 物件導向基礎 類別與物件 類別的繼承 PHP的類別與物件函數

16 7-3-1類別繼承的基礎 父類別、基礎類別 子類別、延伸類別 兄弟類別

17 7-3-2類別的繼承 使用『extends』關鍵字來繼承父類別 子類別呼叫父類別的成員函數,與使用到『 parent ::』關鍵字

18 <!-- 程式範例:Ch7-3-2.php -->
<html> <head> <title>類別的繼承</title> <? // 父類別Vehicle類別 class Vehicle { var $no; // 車號 var $owner; // 所有人 function setNumber($no) { $this->no = $no; } function setOwner($owner) { $this->owner = $owner; } function printVehicle() { // 顯示車輛資料 echo "所有人: " . $this->owner . "<br>"; echo "車號: " . $this->no . "<br>"; } // Car類別宣告, 繼承自Vehicle類別 class Car extends Vehicle { var $doors; // 幾門 // 建構子 function Car($owner, $no, $doors = 4) { parent::setNumber($no); // 呼叫父類別的成員函數 parent::setOwner($owner); $this->doors = $doors; function printCar() { // 顯示轎車資料 echo "====轎車資料====<br>"; parent::printVehicle(); // 呼叫父類別的成員函數 echo "幾門: " . $this->doors . "<br>"; ?> </head> <body> <? // 建立物件 $sentra = new Car("陳會安", ); $civil = new Car("江小魚", , 2); // 更改所有人 - 呼叫繼承的成員函數 $sentra->setOwner("張無忌"); // 呼叫物件的成員函數 $sentra->printCar(); $civil->printCar(); ?> </body> </html>

19 7-3-3複寫父類別的成員函數 如果父類別的成員函數不符合需求,在子類別可以宣告同名的成員函數取代赴類別的成員函數複寫(override)

20 <!-- 程式範例:Ch7-3-3.php -->
<html> <head> <title>覆寫父類別的成員函數</title> <? // 父類別Vehicle類別 class Vehicle { var $no; // 車號 var $owner; // 所有人 // 建構子 function Vehicle($owner, $no) { $this->no = $no; $this->owner = $owner; } function printVehicle() { // 顯示車輛資料 echo "所有人: " . $this->owner . "<br>"; echo "車號: " . $this->no . "<br>"; // Car類別宣告, 繼承自Vehicle類別 class Car extends Vehicle { var $doors; // 幾門 function Car($owner, $no, $doors = 4) { parent::Vehicle($owner, $no); // 呼叫父類別的建構子 $this->doors = $doors; // 覆寫父類別的成員函數 // 顯示轎車資料 parent::printVehicle(); // 呼叫父類別的成員函數 echo "幾門: " . $this->doors . "<br>"; ?> </head> <body> <? // 建立物件 $sentra = new Car("陳會安", ); $civil = new Car("江小魚", , 2); // 呼叫物件的成員函數 $sentra->printVehicle(); $civil->printVehicle(); ?> </body> </html>

21 outline 物件導向基礎 類別與物件 類別的繼承 PHP的類別與物件函數

22 7-4PHP的類別與物件函數 函數 說明 class_exits(string) 檢查類別名稱是否存在?? get_class($obj)
傳回參數物件的類別名稱 get_parent_class($obj) 傳回參數物件的父類別名稱 get_object_vars($obj) 傳回參數物件成員資料變數的結合陣列。 get_class_methods(string) 傳回參數類別名稱字串的成員函數陣列 method_exists($obj,string) 檢查參數1有參數2的成員函數名稱?? is_subclass_of($obj,string) 檢查參數1為參數2的子類別??

23 <!-- 程式範例:Ch7-4.php -->
<html> <head> <title>PHP的類別與物件函數</title> <? include "Ch7-4.inc"; ?> </head> <body> <? // 建立物件 if (class_exists("Vehicle")) { $vehicle = new Vehicle(); echo "建立\$vehicle物件<br>"; } if (class_exists("Car")) { $car = new Car("陳會安", ); echo "建立\$car物件<br>"; // 顯示物件所屬的類別 echo "\$vehicle物件是類別: ".get_class($vehicle)."<br>"; echo "\$car物件是類別: ".get_class($car). "<br>"; echo "\$car物件的父類別: ".get_parent_class($car)."<br>"; // 顯示成員變數 echo "\$car物件的成員變數: <br>"; $array = get_object_vars($car); while (list($prop, $val) = each($array)) echo "$prop = $val "; // 顯示成員函數 echo "<br>\$car物件的成員函數: <br>"; $array = get_class_methods(get_class($car)); foreach ($array as $method) echo "$method() "; echo "<br>"; // 檢查物件方法是否存在 if (method_exists($car, "printCar")) echo "\$car物件的printCar()成員函數存在<br>"; if (is_subclass_of($car, "Vehicle")) echo "\$car物件是Vehicle的子類別<br>"; ?> </body> </html>

24 <!-- 程式範例:Ch7-4.inc -->
<? // 父類別Vehicle類別 class Vehicle { var $no; // 車號 var $owner; // 所有人 function setNumber($no) { $this->no = $no; } function setOwner($owner) { $this->owner = $owner; } function printVehicle() { // 顯示車輛資料 echo "所有人: " . $this->owner . "<br>"; echo "車號: " . $this->no . "<br>"; } // Car類別宣告, 繼承自Vehicle類別 class Car extends Vehicle { var $doors; // 幾門 // 建構子 function Car($owner, $no, $doors = 4) { parent::setNumber($no); // 呼叫父類別的成員函數 parent::setOwner($owner); $this->doors = $doors; function printCar() { // 顯示轎車資料 echo "====轎車資料====<br>"; parent::printVehicle(); // 呼叫父類別的成員函數 echo "幾門: " . $this->doors . "<br>"; ?>


Download ppt "大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)"

Similar presentations


Ads by Google