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;
