PHP4.x 版本:
PHP 4.x 的構造函數名與類名相同。
子類的構造函數名與子類名相同(廢話)。
在子類里父類的構造函數不會自動執行。
要在子類里執行父類的構造函數,必須執行類似以下語句:
$this->[父類的構造函數名()]
例如:
class base1 { function base1() { echo 'this is base1 construct'; } } class class1 extends base1 { function class1() { $this -> base1(); echo 'this is class1 construct'; } } $c1 = new class1;
PHP5.x 版本:
PHP5.0 以上版本對類的功能進行了很大的擴充。類的構造函數統一命名為__construct()。
子類的構造函數名也是__construct()(也是廢話)。
在子類里父類的構造函數會不會執行,分兩種情況:
1、如子類不定義構造函數 __construct(),則父類的構造函數默認會被繼承下來,且會自動執行。
2、如子類定義了構造函數 __construct(),因為構造函數名也是__construct(),所以子類的構造函數實際上是覆蓋(override)了父類的構造函數。這時執行的是該子類的構造函數。
這時如果要在子類里執行父類的構造函數,必須執行類似以下語句:
parent::__construct();
例如:
class base2 { function __construct() { echo 'this is base2 construct'; } function __destruct() {} } class class2 extends base2 { function __construct() { parent::__construct(); echo 'this is class2 construct'; } }
注意 parent::__construct(); 語句不一定必須放在子類的構造函數中。放在子類的構造函數中僅僅保證了其在子類被實例化時自動執行。
PHP4.0 和 5.0 類構造函數的兼容問題:
在 PHP5.0 以上版本里,還兼容了 4.0 版本的構造函數的定義規則。如果同時定義了4.0的構造函數和 __construct()函數,則__construct() 函數優先。
為了使類代碼同時兼容 PHP4.0 和 5.0,可以采取以下的方式:
class class3 { function __construct() //for PHP5.0 { echo 'this is class2 construct'; } function class3() //for PHP4.0 { $this -> __construct(); } } $c3 = new class3;