2012-10-29 239 views
15

PHP Constructors and Destructors documentation它規定如果子類不定義構造函數,是否調用父構造函數?

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

但是如果子類沒有調用構造函數,父類構造函數仍然會被調用呢?或者我們應該創建一個調用父構造函數的構造函數嗎?

IE:

class BaseClass { 
    function __construct() { 
     print "In BaseClass constructor\n"; 
    } 
} 

class SubClass extends BaseClass { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

回答

14

也許這有點明顯,但做了一些環顧四周,並直接回答這個問題,令人驚訝的是不是很容易找到所以在這裏,它是:

如果子類沒有不是定義了一個構造函數,那麼父構造函數將被調用。

在下面的例子中,$ obj仍然會調用BaseClass的構造函數,因爲SubClass從來沒有調用構造函數。

class BaseClass { 
    function __construct() { 
     print "In BaseClass constructor\n"; 
    } 
} 

class SubClass extends BaseClass { 
    //I do not have a constructor :(
} 

$obj = new SubClass(); 
+1

也許[手冊](http://www.php.net/manual/en/language.oop5.decon.php)最近更新了,但它確實聲明,「如果孩子沒有定義構造函數,那麼它就像普通的類方法一樣可以從父類繼承(如果它沒有被聲明爲私有的)。「 – MrWhite

+0

@ w3d感謝您的更新:)。 –

+0

你甚至可以聲明一個構造函數爲private嗎?這似乎首先打敗了上課的目的。 – eggmatters

6

考慮到構造函數是一種可以像任何其他方法一樣重寫的方法。如果父類具有構造函數,則其所有子類都將繼承該構造函數。如果一個孩子重寫構造函數,這將在創建新對象時使用,父類的構造函數不是隱式調用的。如果孩子沒有重寫構造函數,則會使用父項的構造函數。這個概念適用於多繼承。

相關問題