- 了解物件導向封裝與繼承的概念
- 了解 PHP 使用封裝與繼承的方法
物件封裝概念與方法
- 封裝 (Encapsulation)的目的 :
- 用於限制物件資源的使用
- 存取權限分類:
- public : 可以在任何地方存取該物件資源!若沒指定,PHP 會指定其為預設值!
- protected : 可以在自身類別和子類別中存取!
- private : 只能在自身類別中存取!
- 例:MyDog.php
<?php class MyDog { // 定義 dog 的種類「屬性」,並設定「公開」權限 public $raise = "柴犬"; // 定義 dog 的年紀「屬性」,並設定「保護」權限 protected $age = 5; // 定義 dog 的名字「屬性」,並設定「私人」權限 private $name = "Peter"; // 定義取得 dog 屬性值取得的「方法」, 並設定「公開」權限 public function getPara(){ echo "MyDog->raise : ".$this->raise."<br />"; echo "MyDog->age : ".$this->age."<br />"; echo "MyDog->name : ".$this->name."<br />"; } } // 產生實際物件 $mydog = new MyDog(); // 利用 getPara() 方法,取出實際物件的屬性值 $mydog->getPara(); // 直接使用物件,取出實際物件的屬性值,並且與 getPara() 方法對照 echo "mydog->raise : ".$mydog->raise."<br />"; echo "mydog->age : ".$mydog->age."<br />"; echo "mydog->name : ".$mydog->name."<br />"; ?>
- 建構子(constructor)與解建構子(destructor)
- 建構子 : 用於建立物件時,一併設定好物件相關屬性與設定!
- 解建構子 : 用於消除物件時,一併解除物件相關屬性與設定!通常放於類別最後面,程式會自動執行,不需要特別呼叫!
- 例 : 修改先前的 dog.php 程式
<?php class dog { // 設定狗的屬性 public $name; public $color; public $style; //設定建構子 public function __construct($name,$color,$style){ $this->name = $name; $this->color = $color; $this->style = $style; } public function dogRun(){ echo "狗狗跑步中..."; } public function dogBark(){ echo "狗叫..."; } public function __destruct(){ echo "狗狗回家了..."; } } ?>
- 利用 demo.php 來使用上述 dog.php 程式:
<?php include "dog.php"; $myDog = new dog("來福","白色","台狗土狗"); $myDog->dogRun(); ?>
- 繼承(extends)
- 作用
- 避免寫出重複的程式碼!
- 依據需求,重複利用相同程式碼,做出功能不同的程式!
- 子類別繼承父類別的屬性與方法,免去定義相同功能!
- 必要時,子類別除了可以定義自己的屬性與方法,也可改寫父類別的屬性與方法!
- 語法格式 :
class 類別名稱 { class 子類別名稱 extends 父類別名稱 { 可執行的程式; }
- 範例 : 牧羊犬是狗的一個子類別 Shepherd.php
<?php // 引入 dog 類別 include "dog.php"; // 定義牧羊犬 Shepherd 是 狗 dog 的子類別 class Shepherd extends dog{ // 定義子類別需要的屬性 protected $age; public function __construct($name,$color,$style,$age){ // 繼承父類別的屬性 parent::__construct($name,$color,$style); $this->name = $name; $this->color = $color; $this->style = $style; $this->age = $age; } // 定義子類別的方法 public function doWork(){ echo "趕羊..."."
"; } // 覆寫(override)解構子 public function __destruct(){ echo "趕羊到家了"; } } ?> - 利用 demo1.php 來使用上述 Shepherd.php 程式:
<?php include "Shepherd.php"; $mydog = new Shepherd("peter","棕色","牧羊犬",10); echo $mydog->name."
"; echo $mydog->color."
"; echo $mydog->style."
"; echo $mydog->doWork()."
"; //子類別未改寫父類別的方法 echo $mydog->dogRun()."
"; ?>
- 作用
- 覆寫(override)
- 作用
- 子類別需要改寫父類別中,相同的方法名稱時!
- 覆寫後,仍可以呼叫父類別中相同的方法!
- 範例 : Poodle.php
<?php include "dog.php"; class Poodle extends dog{ protected $size; public function __construct($name,$color,$style,$size){ parent::__construct($name,$color,$style); $this->size = $size; } // 覆寫狗叫的 function public function dogBark(){ echo "狗叫...但小聲...."; //呼叫父類別的 dogBark() parent::dogBark(); } } ?>
- 利用 demo2.php 來使用上述 Poodle.php 程式:
<?php include "Poodle.php"; $mydog = new Poodle("Windy","白色","貴賓狗",30); echo $mydog->dogBark(); ?>
- 作用
本章練習:
- 寫兩支程式褲子與上衣,表述其繼承衣服的類別,並計算分別購買10件的費用!