天天看點

php繼承類如何觸發父類中的構造函數,PHP 中類的繼承和構造函數

HP4.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;