Table of Contents
什麼是 Constructor
Constructor 是一種特殊的方法,在創建物件的時候自動執行。這個方法主要用於初始化物件的屬性或者執行其他必要的設置。
是否必要
Constructor 不是必要的; 但在需要設定一些初始值或狀態的情況下,它非常有用。
使用時機
- 初始化物件屬性
- 設定資源連接(例如,資料庫)
- 開啟檔案或其他資源
繼承與父類別的互動
當一個類別繼承自另一個類別時,子類別的 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 很有用。
使用時機
- 斷開資料庫連接
- 釋放資源
- 清理暫存數據
繼承與父類別的互動
如果子類別沒有定義 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 – 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.