2013-12-11 37 views
3

在PHP中,我有兩個類:數據庫條目創建PHP對象時重用數據庫連接

數據庫包含連接屬性和方法。例如,數據庫查詢::可以被用來傳遞一個查詢串等

是一個通用的項標識符。它通過傳遞一個itemID來構建,然後用它來查詢數據庫中剩下的項目信息。

在這種情況下,如果需要數據庫訪問,創建Item對象的最佳做法是什麼?這是正常使用此語法建立每一個:

$item = new Item(12345, $db); 

或者是更好的,acceptible,或可能創建數據庫對象,並把它用於在應用程序中創建的每個項目,使得通話有可能成爲:

$item = new Item(12345); 

第二,似乎有很多清潔(可以擴大,使相似類型的對象不還需要一個$ DB插件),但我在尋找那些誰擁有更多的建議在這方面比我經驗!謝謝!

+4

您可以使用[此方法](http://stackoverflow.com/a/11369679/727208)和數據庫實例的延遲初始化(它也可以針對mysqli進行調整)。 –

回答

2

我的建議是最有經驗的開發商在你的第一個例子證明對依賴注入的方法將傾斜。

爲什麼?

很大程度上是因爲這允許您從依賴項的實現中將正在注入依賴項的類分離。

所以考慮依賴注入例子:

Class some_class { 
    protected $db; 
    __construct($db) { 
     if($db instanceof some_db_class === false) { 
      throw new Exception('Improper parameter passed.'); 
     } 
     $this->db = $db; 
    } 

} 

在這裏,你可以通過任何類型的對象,只要有人的some_db_class一個實例可能是實現通過使用相同的方法,即對象的子類這個班。只要方法得到實現(這當然也可以檢查傳入的對象是否實現了特定的接口,而不是檢查其實例類型),這對此類無關緊要。

這意味着,例如,您可以傳遞一個模擬DB對象進行測試或類似的東西。只要方法得到實施,課程就不會在意。

現在考慮單方式(或從與類DB的類似實例):

Class some_class { 
    protected $db; 
    __construct() { 
     $this->db = some_db_class::get_instance(); 
    } 
} 

在這裏,你已經緊耦合類到一個特定的數據庫類。如果你想用模擬DB實現來測試這個類,那麼你就需要修改類來做這件事,這會變得非常痛苦。

我甚至不會討論使用global,因爲這只是很差的做法,根本不應該考慮。

+0

我會建議僅爲some_db_class typehinting,但如果你這樣做,有一個例外就是:'InvalidArgumentException'; – Jimbo

+0

@jimbo是類型提示是一個很好的建議,雖然如果您需要檢查傳遞的對象是否實現了特定的接口,那麼這將毫無幫助。 –

+0

你可以鍵入一個界面當然......這是做事的最佳方式:-) – Jimbo

-4

通常情況下,數據庫連接對象是全局的,或全局可訪問的。這適用於絕大多數應用程序。

我做這樣的事情(簡體例如用途):

$db = connect_to_db(); 

function GetDB() 
{ 
    global $db; 
    return $db 
} 

//inside the item object 

function Load($id) 
{  
    $db = GetDB(); 
    $db->query(..); 
} 

有,當然情況下這是不是最好的路線。一如既往,它取決於您的應用程序的特定需求。

+3

-1:**通常**這是在任何應用程序中最有害的事情。 –

+0

不可以。不要使用全局聲明。 –

+0

呵呵,對於絕大多數應用程序來說,這很好。 – GrandmasterB

-3

我會建議使用Singleton模式進行數據庫連接。這實際上是最佳做法。因爲你真的不需要數據庫連接的實例。

class Database_Instance 
{ 
    private static $database; 
    public static function getDatabaseObject() { 
     if (!self::$db) { 
      self::$db = new PDO(); 
      } 
     return self::$db; 
    } 
} 

function callWhatSoEver() 
{ 
    $connection = Database_Instance::getDatabaseObject(); 

} 

有關Singleton模式的更多信息,請參見:http://en.wikipedia.org/wiki/Singleton_pattern

+3

根本不是最佳實踐。也許是10年前。 –

+0

我認爲依賴注入是行業發展的方式。這可能不像PHP wspace那樣明顯,因爲PHP並沒有像真正的大型軟件公司那樣被廣泛使用。 –

+0

謝謝,感謝它;) –