2014-09-26 50 views
0

我爲我的項目創建了一個註冊表模式,它可以實例化或獲取對任何對象的現有引用。替代將相同參數傳遞給每個函數

但是,現在我發現自己必須將$registry傳遞給項目中幾乎所有的函數和構造函數,因爲它們中的大多數都需要自己實例化其他類。這本身並沒有那麼糟糕,這正是註冊管理機構應該做的事情,但我想保留我的功能更加「純粹」,只需要獨特的參數。

我可以將類擴展到具有$registry對象的父類,但由於我們正在處理PHP,並且僅限於只擴展一個類,所以這不是一個好的解決方案。

下面是一個例子來說明它更好。

Class controller { 
    __construct($registry,other parameters) { check conditions; addView($registry); } 
    addView(viewObject($registry); 
} 

任何想法保持設計更優雅,而不是通過$registry所有的時間?

+0

如果一個對象需要一個註冊表,那麼它需要一個註冊表。如果你在做DI(你應該),那麼你必須在某個地方傳遞它。如果你唯一擔心的是你基本上在所有這些類中重複相同的構造函數......我並不認爲這是一個大問題。 – deceze 2014-09-26 12:00:24

+0

我在做DI,是的,我唯一擔心的事情是,我的大部分函數的參數(不管是構造函數還是不是)都有$註冊表。擔心這是一個糟糕的主意,那麼稍後改變它就太晚了。如果這被認爲是設計項目的可接受的方式,並且沒有其他替代方案,那麼這個問題已經得到解答。 – Rob 2014-09-26 12:03:08

回答

0

我決定爲我的項目使用$ GLOBALS ['registry']。

這是唯一的全球使用和允許它。雖然全局變得不被接受,因爲它可能引入錯誤並使代碼難以維護,但事實上,在99%的函數中需要註冊表保持項目乾淨,無法將註冊表傳遞給所有函數,並且它是唯一的全球大大降低了濫用的風險。