2009-12-15 58 views
25

相當直接的問題。在C++中,父構造函數將在子構造函數之前隱式調用,那麼PHP有什麼邏輯不要這樣做?爲什麼PHP不會自動調用父構造函數?

編輯:我已經從盧克曼得到了一個很好的答案,但我希望更多的原因爲什麼有差異。也許這個問題應該是爲什麼C++不允許自定義調用父構造函數?我想這是另一個問題。

+2

是的,我明白了!我確定語言的差異影響了決定是否打電話給家長 - 我想知道原因。 – Skilldrick 2009-12-15 10:28:55

+8

這有點像說「爲什麼狗不嘎嘎?」:「因爲他們不是鴨子。」 – Skilldrick 2009-12-15 10:30:03

+0

2Skilldrick:看起來像這是問題的答案:) – ep3static 2009-12-15 11:15:20

回答

24

我認爲這是PHP讓你手動調用父類的構造,一件好事,因爲它可以讓孩子的構造如以下幾點:

public function __construct() { 
    // set up variables that parent::__construct() requires 
    $var1 = get_stuff_from_db(); 
    $var2 = get_stuff_from_webservice(); 

    parent::__construct($var1, $var2); 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

甚至:

public function __construct($param) { 
    // call differently based on condition 
    if (is_array($param)) 
     $param['id'] = 0; 
     parent::__construct($param); 
    } 
    else { 
     parent::__construct($param, 0, TRUE); 
    } 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

含義,你是自由的在孩子的任何地方調用父構造函數,並且可以在調用之前和之後自由地做些事情。這確實不是一個功能嗎?

+0

請注意,只有在構造函數體未包含對其的顯式調用時,才能自動調用父構造函數。 – putgeminmouth 2011-01-06 07:37:55

+1

需要子類在初始化之前進行初始化的基類...:O我強烈建議在該場景中的任何人重新考慮其應用程序設計。再說一遍,PHP的潛在混雜因素沒有限制。 – developerbmw 2015-06-15 22:05:22

+0

這很糟糕,因爲在實例化對象時總是應該調用構造函數。通過繼承循環,繼承的對象類型被實例化,並且還有一個標誌,說明構造函數不應該被觸發。這違反了一般構造規則並導致混淆(證明在OP中)。另一方面,像C#或C++這樣的語言允許隱式地要求構造函數延遲執行,而不是破壞在實例化時調用的構造函數的默認規則。這是PHP的一個非常愚蠢的部分,應該解決。 – Jimmyt1988 2016-07-28 17:24:55

1

避免緊耦合的,這就是爲什麼繼承(擴展Java中的關鍵字)是邪惡和接口類是首選看JavaWorld的文章: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html

不過這將是巨大的,如果有一些指令調用父在某指向一個像forward這樣的特殊關鍵字,但是我還沒有看到任何語言(甚至Rebol)的這一點,除了由Paul Allen(是微軟的聯合創始人)發明的未知語言,即Openscript。

+0

調用父母的方法?很多OOP語言都有。像PHP中的'parent'前綴,Python中的super()',Java中的'super'以及甚至在C++中使用父類名稱,比如'BaseClass :: method()'。 – Lukman 2009-12-21 16:01:50

+0

所有OOP都有這是OOP的一部分:)。這並不意味着你應該過度使用它。 – 2009-12-25 19:49:41

+0

繼承是邪惡的?什麼?所以你說,蛇和長頸鹿是動物的事實,你不應該繼承任何動物類的屬性,而是......什麼?創建一個接口,該接口具有一個表示指向動物的指針的方法?什麼?這是甚麼正確的?嘖。不要讓我接觸到說「多重繼承不應該存在」的人,有真實存在的情況下,它是合乎邏輯的。它們是罕見的情況,但它們確實存在。 – Jimmyt1988 2016-07-31 01:34:49

7

當您在子類中沒有構造函數時,父類會自動調用。

如果您決定向子類添加構造函數,那麼您當然需要顯式調用父構造函數。如果您已經花時間爲您的子類添加構造函數,那麼再添加一行代碼parent::__construct();似乎不是什麼大問題。但最重要的是一個方便的靈活性。

+3

PHP是唯一可以稱爲「方便的靈活性」的糟糕設計的語言:D – developerbmw 2015-06-15 22:07:25

+1

不確定你在這裏說什麼?我認爲只有一個構造函數負責讓對象進入有效狀態纔是更好的設計。通過混合兒童和父母的構造函數,我會說有更多的要跟蹤。否則,不要創建一個子構造函數。所以PHP很方便地鼓勵使用一個構造函數。 – prograhammer 2015-06-16 15:24:02

+1

@Brett你在說什麼樣的壞設計;謹慎解釋? – Kyslik 2015-09-03 11:15:01

相關問題