2014-03-14 76 views
1

這裏是我的index.phpphp mysql:如何避免在一個類中的多個數據庫連接?

<? 
require("Annonce.php"); 
$annonce = new Annonce(); 
$annonce->id=1; 
$annonce->delete(); 

?> 

我Annonce.php是!

<?php 

require("DB.php"); 
class Annonce extends DB { 
}  
?> 

最後DB是:

<?php 
$db = new PDO('mysql:host=localhost;dbname=annonces;charset=utf8', 'root', ''); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 


class DB { 
    public static $debug = true;  
    function __construct() { 
     # code... 
    } 
    function delete() { 
     $id = $this->id; 
     $table = get_class($this); 
     $sql="delete from $table where id=$id";  
     if ($this::$debug) echo $sql; 

    } 

    function get() { 
     $sql="select *..."; 
    } 

} 
?> 

我不知道什麼是定義$ DB連接的最佳策略是什麼?

如果我在DB類中定義它,它會在任何時候創建一個「Annonce」對象時建立一個連接。也許使用$ db作爲GLOBAL(我認爲它不乾淨)

對此有何建議?

+0

也許你會對[Singleton pattern]感興趣(http://php.net/manual/de/language.oop5.patterns.php)。 – Debflav

+0

或依賴注入容器模式 –

回答

1

創建一個Singleton,有些事情是這樣的:

class DB 
{ 
    private $_db; 
    private $_instance; 
    private function __construct() 
    { 

    $this->_db = $db = new PDO('mysql:host=localhost;dbname=annonces;charset=utf8', 'root', ''); 

} 

public static function getInstance() 
{ 
    if(!(self::$_instance instanceof DataBase)){ 
     $c = __CLASS__; 
     self::$_instance = new $c; 
    } 
    return self::$_instance; 
} 
//.....other code 

} 

使用它通過:

$db = DB::getInstance(); 
0

你可以定義爲一個服務的連接,並使用依賴性Injuection集裝箱(DIC)提供通過提供依賴注入容器的任何其他需要它的功能/模塊/類的連接。疙瘩是由「給我們帶來Symfony的人」的simple DIC Solution

無論如何,擁有DIC是一個好主意。

對於您的問題,這可能看起來是「頂級」(,因爲辛格爾頓可以明確地解決您的問題),但考慮到DIC會使您的工作得到更多改進。你問了一個乾淨的解決方案。 Singleton設計模式只有在你不使用單元測試時纔是乾淨的,因爲Singletons將會是get you into trouble with mocking

Read more about it here

相關問題