2013-01-08 14 views
1

我現在有一個使用辛格爾頓,像這樣一個數據庫包裝靜態方法:從一個Singleton切換到依賴注入,並呼籲,需要一個數據庫連接

class Database { 
    private static $db; 

    public static function getInstance() { 
     if(!self::$db) { 
      self::$db = new PDO(); 
     } 
     return self::$db; 
    } 
} 

我也有,有一個User類一些方法,我想靜態調用,但他們需要一個數據庫連接,我正在做像這樣:

class User { 
    private static $db; 

    public function __construct() { 
     self::$db = Database::getInstance(); 
    } 

    public static function someMethod() { 
     self::$db->someQuery(); 
    } 
} 

User::someMethod(); 

我的問題是,我將如何完成使用依賴注入,而不是辛格爾頓同樣的事情,沒有進行多個數據庫連接?

+0

什麼依賴注入庫您使用?在Zend Framework中,默認情況下你會得到相同的實例。否則,你必須編寫'$ di-> newInstance('My \ B');'。看看[這裏](http://zf2.readthedocs.org/en/latest/modules/zend.di.quick-start.html) – bitWorking

回答

1

你會簡單地傳遞這樣的數據庫連接的構造器:

class User { 
    private $db; 

    public function __construct($db) { 
     if ($db instanceof Database) { 
      $this->db = $db; 
     } else { 
      throw new Exception('Give me a Database object'); 
     } 
    } 

    public function someMethod() { 
     $this->$db->someQuery(); 
    } 
} 
+0

但是這並不能確保你在整個應用程序中使用相同的實例。所以你需要一個額外的層。 (DI-Container) – bitWorking

+0

@redreggae好評。 DI容器對於複雜應用程序非常有用,可以管理用於依賴注入的對象的正確實例化。 –

+0

這是如何與靜態方法一起工作的? –

相關問題