建構子 ¶
void__construct ([ mixed$args [, $... ]] )
PHP 5 允行開發者在一個類別中定義一個方法作為建構子。具有建構函式的類別會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。
Note: 如果子類別中定義了建構子則不會隱式呼叫其父類別的建構子。要執行父類別的建構函數,需要在子類別的建構子中呼叫parent::__construct()。如果子類別沒有定義建構函式則會如同一個普通的類別方法一樣從父類別繼承(假如沒有被定義為 private 的話)。
Example #1 使用新標準的建構子
class BaseClass { function __construct(){ print "In BaseClass constructor<br>"; } } class SubClass extends BaseClass { function __construct(){ parent::__construct(); print "In SubClass constructor<br>"; } } class OtherSubClass extends BaseClass {} $obj = new BaseClass(); $obj = new SubClass(); $obj = new OtherSubClass();
輸出結果:
In BaseClass constructor
In BaseClass constructor
In SubClass constructor Class con類別中找不到 __construct() 函數也沒有從父類別繼承一個的話,它就會嘗試尋找舊式的建構函數,也就是和類別同名的函數。因此唯一會產生相容性問題的情況是:類別中已有一個名為 __construct() 的方法卻被用於其它用途時。
與其它方法不同,當 __construct() 被與父類別 __construct() 具有不同參數的方法覆寫時,PHP 不會產生一個 E_STRICT 錯誤訊息。
自 PHP 5.3.3 起,在命名空間中,與類別名稱同名的方法不再作為建構子。這項改變不影響不在命名空間中的類別。
Example #2 Constructors in namespaced classes
namespace Foo; class Bar{ public function Bar(){ //在PHP5.3.0-5.3.2中被看作是构造函数 //自PHP5.3.3起被视作一个普通的方法 } }
析構函數 ¶
void__destruct ( void )
PHP 5 引入了析構函數的概念,這類似於它面向對象的語言,類似於其 C++。析構函數會在到某個物件的所有參考都被刪除或當物件被明確銷毀時執行。
Example #3 析構函式範例
<?php class MyDestructableClass{ function __construct(){ print "In constructor<br>"; $this->name = "MyDestructableClass"; } function __destruct(){ print "Destroying ".$this->name.'<br>'; } } $obj = new MyDestructableClass(); ?>
輸出結果:
In constructor
Destroying MyDestructableClass
和建構函式一樣,父類的斷層構構函式不會被引擎暗析構函式不會被引擎暗析。要執行父類別的析構函數,必須在子類別的析構函數體中明確地呼叫 parent::__destruct()。另外也和建構子一樣,子類別如果自己沒有定義析構函式則會繼承父類別的。
析構函數即使在使用 exit() 終止腳本執行時也會被呼叫。在析構函數中呼叫 exit() 將會中止其餘關閉作業的運作。
Note:
析構函數在腳本關閉時調用,此時所有的 HTTP 頭資訊已經發出。腳本關閉時的工作目錄有可能和在 SAPI(如 apache)中時不同。
Note:
試圖在析構函數(在腳本終止時被呼叫)中拋出一個異常會導致致命錯誤。