__construct在類別中宣告名為 __construct 的函數,即為建構函數。建立物件實例時自動執行。__ 為兩個底線。如同其他函數,建構函數可有參數與預設值。可在一個陳述式中建立物件並設定屬性。
__destruct定義名為 __destruct 的函數,PHP 會在物件銷毀前呼叫。稱為解構函數。
繼承是類別強大功能。子類別(衍生類別)繼承父類別(基底類別)所有屬性與方法,並可新增或覆寫。使用 extends 關鍵字繼承。
建構函數隨其他方法一起被繼承,但建立物件時不會自動執行父類別建構函數。若需此功能,必須用 :: 運算子明確呼叫:parent::__construct()。
早期 PHP 以類別名稱命名建構函數。PHP 5 仍支援此寫法:若類別同時擁有 __construct 與同名函數,PHP 視 __construct 為建構函數。這使舊版類別仍可使用。但新腳本應使用 __construct。新寫法賦予建構函數唯一名稱,不受類別名稱影響,修改類別名稱時無需修改建構函數名稱。
可為建構函數指定存取權限(public/protected/private),影響實例化能力,可實現如 Singleton 等設計模式。
解構函數與建構函數相反。PHP 預設釋放物件屬性記憶體並銷毀相關資源。解構函數允許在使用物件後執行任意程式碼清理記憶體。
當 PHP 判定腳本不再參考物件時呼叫解構函數:
- 函數內部:發生在 return 時
- 全域變數:腳本結束時
若想明確銷毀物件,可將變數指派為 NULL 或呼叫 unset()。
<?php
class Counter {
private static $count = 0;
function __construct() { self::$count++; }
function __destruct() { self::$count--; }
function getCount() { return self::$count; }
}
$c = new Counter(); // 輸出 1
print($c->getCount() . "<br>");
$c2 = new Counter(); // 輸出 2
print($c->getCount() . "<br>");
$c2 = NULL; // 輸出 1
print($c->getCount() . "<br>");
?>
新建實例時,記憶體會準備儲存所有屬性。每個實例擁有獨立屬性組,但方法由該類別所有實例共享。