2011-10-25 38 views
0

我有4個班,一個數據庫助手和3這樣定義:如何在由其子類共享的父類中創建對象?

abstract class PageElement 
{ 
    protected $db; 

    abstract public function reconstruct($from, $params = array()); 

    protected function construct_from_db($id, $k) 
    { 
     $this->db = new Database(0); 

     $query = "SELECT * FROM $k WHERE id = %d"; 

     $results = $this->db->db_query(DB_ARRAY, $query, $id); 

     return $results[0]; 
    } 
} 


class Section extends PageElement 
{ 
    function __construct($construct, $args = array()) 
    { 
     $params = $this->construct_from_db($args, 'sections'); 
    } 
    //other methods 
} 


class Toolbar extends PageElement 
{ 
    function __construct($construct, $args = array()) 
    { 
     $params = $this->construct_from_db($args, 'toolbars'); 
    } 
    //other methods 
} 

現在,每個孩子都有它的數據庫對象的自己的實例。我如何在父類中創建數據庫對象並將其分享給每個孩子?

注:

  • 我讀過有關的辛格爾頓的做法,但我不能使用它,因爲我 必須連接到不同的數據庫。
  • 值得注意的是,Section類創建了一個Toolbar類的實例。
  • 另一個問題是,出於某種原因,我無法關閉mysql連接。當我運行的代碼,這會出現警告:

    mysql_close():7不** * * \班一個有效的MySQL-Link的資源\ database.class上線127

+1

嘿,「Simpleton」。它實際上是「Singleton」;) – jprofitt

+0

Ahaha!是。我的錯!!! – Tivie

回答

3

理想情況下,您應該在這些類之外創建數據庫對象,然後通過構造函數或setter函數注入它。

abstract class PageElement 
{ 
    protected $db; 

    function __construct($db) 
    { 
     $this->db = $db; 
    } 
    //...rest of the methods 
} 

class Toolbar extends PageElement 
{ 
    function __construct($construct, $db, $args = array()) 
    { 
     parent::__construct($db); 
     $params = $this->construct_from_db($args, 'toolbars'); 
    } 
    //other methods 
} 

然後你就可以創建對象:

$db = new Database(0); 
$toolbar = new Toolbar($construct,$db,$args); 
$section = new Section($construct,$db,$args); 

這樣,所有的對象都共享同一個數據庫對象。

P.S .:而不是在這裏使用新建數據庫對象,您可以從參數化工廠獲取它。

$db = Factory::getDBO($param); 
+0

使用工廠方法數據庫必須是靜態的權利? – Tivie

+0

取決於你如何實現它。你的工廠可以返回一個新的實例或同一個實例(即單例) – Vikk

0

你可以使$db靜態我想。

+0

這不是說每個對象的每個新實例都會引用相同的數據庫對象嗎? – Tivie

相關問題