2008-12-18 51 views
0

我最近把我的Db啓動代碼從我的Page類的__construct中取出,並在我啓動Page類後放置它。我從Page類中刪除它,因爲我希望能夠從任何地方訪問它(例如其他類)。它也會在啓動時將服務器,用戶名,密碼和數據庫參數傳遞給它,而且我不希望每次都輸入這些參數。PHP - 哪裏是發起數據庫課程的最佳地點?

現在有什麼辦法可以從Page類下訪問它嗎?我已經嘗試了幾種方法,甚至是全球性的(我被告知這是一種可怕的方式來做事情),目前爲止沒有效果。我對面向對象仍然很陌生,但我盡我所能教自己。

我應該讓它成爲一個靜態類嗎?這會影響延遲連接器到Db我已安裝?

任何幫助將不勝感激。

謝謝

[編輯]

類似的問題:Global or Singleton for database connection?

+0

我問了一個類似的問題[數據庫連接的全局或單例?](http://stackoverflow.com/questions/130878/global-or-singleton-for-database-connection) – Imran 2008-12-18 04:41:23

回答

2

某種形式的全球性(是全局變量,單身或其他變體)是對先前方法的改進,因此您處於正確的軌道上。一般來說,你應該儘量減少程序狀態的範圍(有幾個原因,我不會在這裏)。有一個全球變量與這個原則相沖突。這個問題有不同的解決方案,但最強大和經常被忽視的方法是使用控制反轉;你的班級不應該獲得依賴,而應該接收它。例如,假設你現在有這個

class EditUserController { 
    function saveUser() { 
    $db = Database::GetInstance(); 
    $db->execute("update users set ...", ...); 
    } 
} 

你可以變成這樣:

class EditUserController { 
    function saveUser($db) { 
    $db->execute("update users set ...", ...); 
    } 
} 

在功能參數級別傳遞依賴關係可以是一個有點笨拙,雖然,所以折中的可能是按照對象級別傳遞它:

class EditUserController { 
    protected $db; 
    function __construct($db) { 
    $this->db = $db; 
    } 
    function saveUser() { 
    $this->db->execute("update users set ...", ...); 
    } 
} 

這是OO編程中相當常見的模式。除了傳遞函數參數更實用外,它還具有從運行時(使用它們的地方)分離構造(共享依賴關係彼此連接)的額外好處。這使得許多事情變得更簡單。

0

全局變量確實有使用,而這將是其中之一。除非您可能需要多個數據庫連接(甚至還是),否則我不會看到設置全局$ db對象時出現問題。

另一種方法是有一個靜態的「工廠」類,您可以使用它來獲取對象。在的Joomla 1.5,你的方式訪問數據庫對象是這樣的:

$db =& JFactory::getDBO(); 

的getDBO函數檢查DB對象被創建:如果有,則返回對它的引用,否則連接和初始化,以及然後返回它。

這可能同樣適用於其他「可能成爲全局」的對象,如當前的用戶對象。

+0

我會在開發這樣的東西。我已經看過=&幾次,但我仍然不確定它的含義。 – alex 2008-12-18 04:41:59

+0

它將變量設置爲* reference *。這裏有更多的信息:http://www.php.net/manual/en/language.references.return.php – nickf 2008-12-18 04:45:44

0

創建單例方法以確保任何類只有一個實例。但是,由於人們將其用作快捷全球化的一種方式,因此被稱爲懶惰和/或糟糕的編程。

相關問題