2021年3月12日 星期五

PHP 物件封裝與繼承方法

設定目標:
  • 了解物件導向封裝與繼承的概念
  • 了解 PHP 使用封裝與繼承的方法

物件封裝概念與方法
  1. 封裝 (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 />";
      ?>
      
  2. 建構子(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();
      ?>
      
物件繼承觀念與應用
  1. 繼承(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()."
        "; ?>
  2. 覆寫(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件的費用!