2010-01-20 17 views
4

註冊表設計模式在PHP中是一個很好的解決方案嗎?註冊表設計模式有什麼不好嗎?

對於社交網站(臉書,myspace)。

比方說,我有一個數據庫類創建一個單一的數據庫連接,讓我做數據庫的東西和一個會議類,它可以讓我處理會議以及緩存類,讓我緩存項目和檢索他們。這是我需要在我的網站的每個頁面上訪問的3個主要類。在回顧過去一小時的註冊表模式之後,我認爲它可能是完美的解決方案。我可以將數據庫,會話和緩存對象存儲到註冊表對象中,然後將註冊表對象注入到每個頁面或每個其他類中,並可以訪問我的數據庫,會話和緩存。

在此之前,我使用的是單例模式,所以我將不得不爲每個頁面或其他類中的所有3個主類調用單例方法。

所以我只是想知道是否有使用註冊表類的任何垮臺? 1,我可以看到,看起來可能很難看出哪些類取決於哪些其他類和類。除此之外,它似乎是一個很好的解決方案,我還看到另一篇文章在用戶的註冊表類中,他們在註冊表中存儲設置,在註冊表對象傳入的所有其他類中訪問它們,我相信我會很好地發現這個功能。

所以這裏唯一的問題是我錯過了什麼,或者我只是熱的樂透?


UPDATE

此外,如果使用註冊表來存儲對象,我應該做這樣的事情...

$this->session = $registry->getObject('session'); 

或這個代替

$this->registry->session = $registry->getObject('session'); 

第二種方法似乎可能是簡單的低估以及對象來自哪裏?

回答

-1

您的意思是Singleton s的註冊表,對不對?如果是這樣,這聽起來像你真正想要的是訪問全球三個全局對象,但包含在另一個對象內。

所以,如果你寫cache.php,sessions.php和database.php中,它定義了類CacheSessionsDatabase,要包含所有這些在registry.php定義的Registry對象內。

首先,用這種方法控制實例化的ORDER是很好的。它比簡單地做一個cache.php,sessions.php和database.php的require_once要好,並且在它們中你不僅定義了類,還定義了它的單個全局實例。通過包含/需要它來控制實例化的ORDER。有點低級。更好的辦法是讓你的註冊表對象,當它被創建併成爲一個全局的時候,首先就是控制你的全局變量的順序和想要的創建。

其次,擁有一個Registry.php擁有一個$註冊表全局是非常好的。在各種文件中定義全局變量很難管理。

既然我已經同意你的意見,我向你提出一個重要的問題。你怎麼看這些是不同的:

$registry->getObject('session'); 
$registry->getObject('database'); 
$registry->getObject('cache'); 

與:

$registry->getSession(); 
$registry->getDatabase(); 
$registry->getCache(); 

個人而言,我喜歡後者。您沒有使用字符串「session」來引用通過超類型getObject獲得的Session對象。相反,您正在使用getSession()來獲得會話。它讀得更好。

畢竟,你的註冊表知道所有關於這三個全局變量的信息,它明確地創建它們,所以它已經被鎖定到一個單一的目的。添加具體方法也與其單一目的並不「弱」或「不好」。相反,我認爲這是更少的代碼,更容易在眼球上。

+0

很好的建議,我喜歡$ registry-> getSession();方法我只是有另一種方式,使其更加動態和能夠設置和反對註冊 – JasonDavis 2010-01-20 03:26:46