2010-02-23 40 views

回答

94

不,如果子類定義了構造函數,則不會調用父類的構造函數。

從你的子類的構造函數,你必須調用父類的構造函數:

parent::__construct(); 

傳遞給它的參數,如果需要的話。通常,您將在子類的構造函數的開始處,在任何特定代碼之前執行此操作;這意味着,你的情況,你必須:

class Child extends Base { 
    function __construct() { 
     parent::__construct(); 
     echo 'Child __construct<br/>'; 
    } 
} 


而且,僅供參考,您可以在這個頁面中的PHP手冊看一看:Constructors and Destructors - 它規定(引用)

注:父函數則不會隱式調用如果子類 定義構造函數。
爲了讓 運行一個父構造函數,需要在 子構造函數中調用 parent::__construct()

+1

不明確說明這一點,但它們暗示如果子類沒有構造函數,那麼父構造函數將被調用。真的嗎? – andrew 2011-02-09 23:03:41

+9

是的:如果子類沒有定義一個構造函數,父類的沒有被覆蓋,所以被調用;;;;引用手冊:如果子類定義了構造函數**,則父類構造函數不會隱式調用**。 – 2011-02-10 06:32:08

+0

@PascalMARTIN謝謝你,四處張望試圖驗證。接受了一點搜索。 – 2012-10-29 00:22:56

5

好吧,我剛剛發現這個在docs

注:父構造函數不 隱式調用如果子類 定義構造函數。爲了運行 父構造函數,需要在子構造函數 構造函數中調用 parent :: __ construct()。

+1

我在抽象類中編寫構造函數的主要原因是爲了強制繼承此類的每個類都執行指定的代碼。 這是一個真正的恥辱PHP使構造函數的執行可選。 – 2015-06-30 04:35:29

+2

@RyanWilliams有些情況下需要在類中進行一些額外的初始化之前調用父構造函數,並且有些情況下在額外初始化後調用父項。所以PHP允許你也支持更多的用例。 – Nux 2015-10-13 09:15:06

1

如果你需要相同的行爲與C#,這是父類的構造子構造函數之前被一直執行,你可以爲你的子類創建一個假的構造類,並在你的抽象父類中聲明它作爲一個抽象的函數。

E.g.

abstract class Test{ 
    abstract public function __childconstruct(); 
    public function __construct(){ 
    echo "SOME CODE".PHP_EOL; 
    $this->__childconstruct(); 
    } 
} 

class TestExtended extends Test{ 
    public function __childconstruct(){ 
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL; 
    } 
} 

$a = new TestExtended(); 

/* SOME CODE 
    SOME OTHER CODE FROM EXTENDED CLASS */ 
相關問題