Constructor and Destructor,PHP 物件的初始建構與解構

Photo of Man Using Gray Metal Tool

什麼是 Constructor

Constructor 是一種特殊的方法,在創建物件的時候自動執行。這個方法主要用於初始化物件的屬性或者執行其他必要的設置。

是否必要

Constructor 不是必要的; 但在需要設定一些初始值或狀態的情況下,它非常有用。

使用時機

  1. 初始化物件屬性
  2. 設定資源連接(例如,資料庫)
  3. 開啟檔案或其他資源

繼承與父類別的互動

當一個類別繼承自另一個類別時,子類別的 constructor 會覆蓋父類別的 constructor。如果需要執行父類別的 constructor,你可以使用 parent::__construct()

程式範例

<?php
class Person {
  public $name;

  // 父類別的 Constructor
  public function __construct($name) {
    $this->name = $name; // 初始化名字
  }
}

class Student extends Person {
  public $grade;

  // 子類別的 Constructor
  public function __construct($name, $grade) {
    parent::__construct($name);  // 呼叫父類別的 Constructor
    $this->grade = $grade;  // 初始化年級
  }
}

$student = new Student("Tom", "Sophomore");  // 創建 Student 物件並初始化
echo $student->name . " is a " . $student->grade;  // 輸出 "Tom is a Sophomore"
?>

在這個程式範例中,我們有一個 Person 類別和一個從 Person 類別繼承的 Student 類別。在 Student 的 constructor 中,我們用 parent::__construct($name) 呼叫了父類別的 constructor,以初始化 name 屬性。

constructor 觸發點

物件創建時:當你使用 new 關鍵字創建一個新的物件實例時,該類別的 constructor 會自動觸發。

子類別創建時:如果一個子類別繼承了父類別,而子類別創建物件時沒有自己的 constructor,則會觸發父類別的 constructor

什麼是 Destructor

Destructor 是一種特殊的方法,在物件不再需要或被銷毀的時候自動執行。主要用於釋放資源或進行清理操作。

是否必要

與 constructor 類似,destructor 也不是必須的。但在需要釋放資源,如釋放資料庫連線的情況下,使用 destructor 很有用。

使用時機

  1. 斷開資料庫連接
  2. 釋放資源
  3. 清理暫存數據

繼承與父類別的互動

如果子類別沒有定義 destructor,父類別的 destructor 將會被執行。

程式範例

<?php
class Database {
  public $connection;

  // 父類別的 Constructor
  public function __construct() {
    $this->connection = new mysqli("localhost", "user", "password");  // 連接資料庫
  }

  // 父類別的 Destructor
  public function __destruct() {
    $this->connection->close();  // 釋放資源
  }
}

class UserDatabase extends Database {
  public $userTable;

  // 子類別的 Constructor
  public function __construct($table) {
    parent::__construct();  // 呼叫父類別的 Constructor
    $this->userTable = $table;  // 初始化用戶表名
  }

  // 子類別的 Destructor
  public function __destruct() {
    // 進行一些釋放用戶表相關資源的操作
    parent::__destruct();  // 呼叫父類別的 Destructor 釋放資料庫連接
  }
}
?>

在這個範例中,我們有一個 Database 類別和一個從 Database 類別繼承的 UserDatabase 類別。UserDatabase 類別中的 destructor 會在執行完子類別相關的釋放資源操作後,呼叫父類別的 destructor 來釋放資料庫連接。

destructor 觸發點

物件銷毀時:當一個物件不再被使用,或者腳本執行完成,PHP 的垃圾收集機制會自動銷毀該物件,並觸發其 destructor

腳本結束時:當 PHP 腳本執行完畢,所有未銷毀的物件將會被銷毀,並觸發其 destructor

子類別銷毀時:如果子類別有自己的 destructor,則會先觸發子類別的 destructor。如果你在子類別的 destructor 中使用 parent::__destruct(),則還會觸發父類別的 destructor

最後

看完以上的章節,能學習到以下的 PHP 技術知識:

物件導向編程(OOP)的基本概念

Constructor 和 Destructor 是物件導向設計中的重要概念,用於物件的初始化和資源釋放。

Constructor(建構子)

觸發時機與用途:了解 constructor 主要在物件創建時自動觸發,並用於初始化物件的屬性或設定。

繼承與多型:學習如何在子類別中使用 parent::__construct() 來調用父類別的 constructor。

資源初始化:透過實際的程式範例,理解 constructor 如何在實際上運用。

Destructor(解構子)

觸發時機與用途:瞭解 destructor 主要在物件銷毀或腳本結束時自動觸發,用於釋放資源和進行清理工作。

繼承與多型:學習在子類別的 destructor 中如何調用父類別的 destructor。

資源管理:了解 destructor 在資源管理和效能優化方面的重要性。

Constructor vs Destructor

特性比較建構子(Constructor)解構子(Destructor)
目的在物件創建時用於初始化屬性和設定。在物件銷毀或腳本結束時用於釋放資源和進行清理工作。
觸發時機使用 new 關鍵字創建新物件時自動調用。物件被銷毀,或腳本執行完畢時自動調用。
資源管理適用於分配資源,如數據庫連接。適用於釋放資源和內存回收。
繼承如果子類別沒有定義自己的建構子,將調用父類別的建構子。子類別的解構子先被調用,接著如果明確地調用,會觸發父類別的解構子。
顯式調用在子類別中可用 parent::__construct() 顯式調用父類別的建構子。在子類別中可用 parent::__destruct() 顯式調用父類別的解構子。
Constructor vs Destructor

更多參考文章

  • Constructor – explain to you the constructor concept and how to use it to initialize attributes.
  • Destructor – learn how to use destructor to clean resources when the object is deleted.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *