2010-09-02 32 views
3

考慮下面的PHP代碼:簡單的方法來傳遞數據庫對象成擴展類無數次

<?php 
require_once("myDBclass.php"); 
class a { 
    private $tablename; 
    private $column; 
    function __construct($tableName, $column) { 
     $this->tableName = $tablename; 
     $this->column = $column;   
    } 

    function insert() { 
     global $db; 
     $db->query("INSERT INTO ".$this->tableName." (".$this->column.") VALUES (1)"); 
    }  
} 

class x extends a { 
    function __construct() { 
     parent::construct("x", "colX"); 
    } 
} 

class y extends a { 
    function __construct() { 
     parent::construct("y", "colY"); 
    } 
} 
?> 

我有一個是在另一個文件中實例化我的$ db對象,但希望以某種方式傳遞到這個類的每次我在類「a」中定義一個新函數時都不使用全局關鍵字。

我知道我可以通過在實例化類X和Y時傳遞DB對象,然後將它傳遞給類A(類似於當前正在處理的表名和列),但我永遠不知道有多少次我可能會擴展A類,並認爲必須有另一種更簡單的方法。

有人知道我可以考慮實現這個更好的解決方案嗎?

在此先感謝

回答

1

查找到Singleton Design Pattern。您應該沒有必要使用globals,因爲您似乎知道這不是必需的。

+0

我不確定如何提起singleton模式可以幫助他 – Galen 2010-09-02 23:37:36

+2

如果數據庫類爲我們設置了一個單例類,那麼他可以輕鬆調用'$ db = db :: singleton();'和viola,他現在擁有db類可用於類,更好的是它肯定是一個單一的對象,而不是多個/重複。更好的是,只要使用該語句包含dbclass,他就可以在腳本內部的任何位置使用該對象。 – 2010-09-02 23:42:26

+0

這與使用全局$ db基本相同; – Galen 2010-09-03 16:02:43

2

您可以使用PHP的static properties

class A { 
    static $db; 
    public static function setDB($db) { 
     self::$db = $db; 
    } 
} 

現在該屬性將在該對象的所有實例中共享,並且它是子級。