2012-02-11 3 views
0

データベースクラスにシングルトンパターンを使用しないように助言しました。私はそれに賛成であることを完全に理解していない、とにかくこの時点で合意があるように私はルールに従う。PHP:データベース接続を共有するか、新しい接続を作成しますか?

しかし、PHPの一般的なクラスのインスタンスを共有するのは悪い習慣ですか?ここで提供する2つの例の中で最も良いのはどれですか?私は最初のアプローチで実際にシングルトンパターンを使用していますか?

//semi-pseudo Code 

Class DB extends mysqli{ 
    // 
} 

Class A { 
    $db; //Of type Class DB, initialized in the constructor. 

    //In some method 

    //Should I do this, so sharing the data base connection? 
    $b = new DB($db); 

    // OR 

    // Should I instantiate a new instance? 
    $newDb = new DB(); 
    $b = new B ($newDb); 

} 

Class B { 
    $db;//Of type Class DB initialized in the constructor. 

私はタイプDBのメンバーとクラスAを有する

..クラスDBは、データ・ベース・エクステンションである持っています。

クラスAは、クラスBのインスタンスを作成する必要があります。また、クラスBもインスタンスDBを持ちます。

AがBに

にDBインスタンスを渡す必要がありますので、私は依存性注入パターンを使用していますが、私はBに渡す新しいDBインスタンスをインスタンス化する、または私はちょうどAのDBインスタンスへの参照を渡すことができます。

答えて

2

PHPでシングルトンパターンを使用する場合、何らかの言語のように何も問題はありません。あまりにも多すぎると、デザインが不良である可能性があります。

つまり、シングルトンはデータベースアクセスに適しています。なぜそれが悪い考えだと誰が正当化したのですか?

シングルトンに対する主な議論は、単体テストスイートでモックできないため、テストするのが難しいことです。個人的に私はテストでモックオブジェクト(特にPHPUnitで)を避けようとしているので、通常は問題になりません。

+0

シングルトンの悪い側についての説明 – Svisstack

+0

ここに引数があります:http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 –

+0

はい、それは主な引数ですが、インターフェイスの後ろにあなたのシングルトンの実装があるので、それを模擬することができます –

0

新しいDBインスタンスをインスタンス化してBに渡すか、ちょうど がAのDBインスタンスへの参照を渡すことができますか?

もちろん、AのDBインスタンスの参照をBクラスに渡す必要があります。

+0

なぜそれは良いですか? –

+0

DBインスタンスを共有する必要がある場合は、Bクラスへの参照として渡す必要があります。 シングルトンやDIは何を使用しても問題ありません。これは、AクラスのDBインスタンスを取得する方法に関するものです。しかし、それをAからBに渡すことは、refによってのみ実行されるべきです。 –

+0

シングルトンを使うと、インスタンスをまったく渡す必要はありません。ほとんどのシングルトン実装はgetInstance()メソッドなどを提供しているので、DB :: getInstance()メソッドはクラスAとBのインスタンス内から排他的に呼び出すことができますが、インスタンスは実際には同じになります。もちろんインスタンスの周りを渡すこともできますが、なぜシングルトンを使用するのか気にしません。 – quickshiftin

関連する問題