2012-02-11 41 views
0

我一直建議不要爲我的數據庫類使用單例模式。我還沒有完全理解它有什麼缺點,無論如何,似乎在這一點上達成了一致,所以我遵循了這個規則。PHP:共享數據庫連接或創建一個新的?

但是,一般在PHP中共享類的實例是壞習慣嗎?在這裏提供的兩個例子中哪一個最好?事實上,我使用第一種方法的單身模式?

//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是數據鹼基延伸..

我有一類與類型DB中的一員。

A類需要創建一個B類的實例,而B類的實例又有一個DB類型的成員。

我使用依賴注入模式,使A應傳遞一個數據庫實例B.

我應該實例化一個新的數據庫實例傳遞到B,或者我可以只傳遞給A的數據庫實例的引用。

回答

2

在PHP中使用Singleton模式沒有任何問題,就像任何語言一樣,太多的東西都可能表示設計不佳。

也就是說,Singleton非常適合數據庫訪問。有沒有人證明爲什麼它被認爲是一個壞主意?

對Singleton的主要爭論是難以測試,因爲你不能用單元測試套件來嘲笑它們。就我個人而言,我儘量避免在我的測試中使用模擬對象(尤其是w/PHPUnit),所以通常無關緊要。

+0

+1有關單身人士糟糕的一面的解釋 – Svisstack 2012-02-11 09:56:57

+0

這裏是參數:http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 – 2012-02-11 09:58:58

+0

是的,這是主要的參數,但你可以把你的單例實現在一個接口後面,所以你可以嘲笑它 – 2012-02-11 10:01:24

0

我應該實例化一個新的數據庫實例傳遞到B,或者我可以只 傳遞給A的數據庫實例的引用。

當然,您必須將A的數據庫實例的引用傳遞給B類。

+0

爲什麼它更好? – 2012-02-11 10:00:23

+0

如果您的要求是共享數據庫實例,則必須將其作爲參考傳遞給B類。 無論你使用Singleton還是DI,這只是關於如何在A類中獲取數據庫實例。但是將它從A傳遞給B應該僅由參考文獻執行。 – 2012-02-11 10:09:00

+0

與Singleton相比,你根本不必傳遞實例。大多數Singleton實現提供了一個getInstance()方法或類似的方法,因此DB :: getInstance()方法可以在類A和B的實例內獨佔地調用,但實例實際上是相同的,這就是Singleton的工作方式。你當然也可以繞過這個例子,但是爲什麼還要帶着Singleton呢。 – quickshiftin 2012-02-11 10:25:35

相關問題