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

什麼是 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 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.
- ← Previous
PHP Composer 教學,為您的 PHP 專案注入活力 - Next →
探索 PHP Abstract Class,物件導向就是不斷的抽象化



