2013-03-17 209 views
6

我要澄清我有PHP構造繼承

一個問題,我有一個會被很多其他的classes.The構造繼承基礎數據庫類看起來是這樣的:

public function __construct ($table) 
{ 
    $this->table = $table; 
    $this->db = new Database(); 
    $this->db->connect(); 
} 

我如下會從孩子這個構造函數中調用:

public function __construct ($something) 
{ 
    parent::__construct("planets_games"); 
} 

我的問題是,PHP不請允許我孩子的構造沒有$什麼參數 我得到如下:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

我覺得我失去了一些東西在我的基本的PHP知識

謝謝非常重要:

Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct() 

我目前通過實例化一個像這樣的對象繞過這你非常需要提前幫忙

+0

是PHP目前是嚴格了,子類的結構參數必須是該父兼容。你沒有得到什麼?你不能做那樣的事情,但是,你可以沒有任何爭論的父母和孩子,而只是從孩子的構念向父母傳遞論據。這是你想要的嗎? – 2013-03-17 10:50:18

回答

5

這個錯誤信息是指liskov substitution principle。 它適用於每個IS-A關係(這是使用繼承(擴展)的含義),並指出每個子類型應該完全可以替換超類型。

但這並不適用於構造函數!你正在使用哪個PHP版本?

看來基類已將構造函數標記爲抽象。這是唯一可以出現 這個錯誤的方法。

你不應該標記構造函數抽象,最終或把它們放在接口!

在大多數語言中,這是不可能的。

由這是最好的做法是,每個 具體對象與最能代表 如何消費者應該充分實例化特定 對象的簽名的構造函數,你應該採取什麼樣的了。在涉及繼承的某些情況下,「借用」父母構造函數是可以接受和有用的。此外, 鼓勵當您爲某個特定類型創建子類時,您的新 類型應該在適當的情況下具有自己的構造函數,以使 對新子類型最有意義。

http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern

+0

對不起,延遲reply.I使用版本5.3.13 – user1840302 2013-03-17 11:38:25

+0

只有當我們談論多態時LSP不適合嗎?我最初的想法是一樣的,但它是一個構造函數,而不是一個常規方法。我們沒有施工人員的合同,是嗎? – zerkms 2013-03-17 20:19:29

+0

不,但在PHP中,您可以標記構造函數爲抽象。我想在一個超級課堂(IScaffold?)在上面的例子中是這樣,否則致命不會發生。使構造函數抽象帶來與LSP相同的約束。我認爲這是不好的做法,正如我上面所述。 – 2013-03-18 06:54:37