CleanMyMac

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

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

什麼是 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.