2013-03-17 11 views
6

PHPのコンストラクタの継承

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

I以下のように子供たちからこのコンストラクタから呼び出します。

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

私の問題は、PHPは私が$何かパラメータせずに子供のコンストラクタを行うことができないということですiは、次を得る:私は私が私の基本的なPHPの知識

感謝で非常に重要な何かをしないのです考える

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

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

私は現在、このようなオブジェクトをインスタンス化することによって、これを迂回していますあらかじめ大いに助けてください

+0

はいPHPは現在、子クラスの構造パラメータは、親のそれに適合するものでなければならないという厳しいです。そして、あなたは何を得ていないのですか?そういうことはできませんが、親と子の両方に議論をすることはできません。まだ子の構造からのみ親に引数を渡す。これはあなたが欲しいものですか? –

答えて

5

このエラーメッセージはliskov substitution principleを参照しています。 これは、すべてのIS-A関係(継承(拡張)を使用する意味)に適用され、すべてのサブタイプがスーパータイプに対して完全に置き換え可能である必要があると記載されています。

しかし、これはコンストラクタには当てはまりません!どのPHPバージョンを使用していますか?

基本クラスがコンストラクタを抽象としてマークしているようです。これが唯一の方法です。 このエラーが発生する可能性があります。

コンストラクタを抽象的、最終的にマークしたり、それらをインターフェイスに配置したりしないでください!

ほとんどの言語でこれは可能ではありません。

これはベストプラクティスが それぞれ具体的なオブジェクトが最高 は、消費者が完全にその特定の オブジェクトをインスタンス化する方法を示して署名を持つコンストラクタを持っているということであるということですから、あなたは離れて取るべき。継承が関係する場合には、親コンストラクタ を「借りる」ことは容認され、有用です。さらに、 は、特定のタイプをサブクラス化するときに、新しい タイプが、適切な場合に新しいサブタイプに対して を最も適切にする独自のコンストラクタを持つようにすることを推奨します。

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

+0

遅れてご返事申し訳ありません。バージョン5.3.13を使用しています – user1840302

+0

多形性について話した場合にのみ、LSPは適していませんか?私の最初の考えは同じでしたが、それはコンストラクタであり、通常の方法ではありません。コンストラクタの契約はありませんか? – zerkms

+0

いいえ、しかしPHPでは、コンストラクタ抽象をマークすることができます。私はスーパークラスで考える(IScaffold?)上記の例ではそうです。さもなければ、致命的なことは起こりません。コンストラクタを抽象化することは、LSPから同じ制約をもたらします。上記のように、これは悪い習慣だと私は思う。 –