2009-10-31 94 views
2

我目前正在進行oophp應用程序。我有一個網站類,其中將包含應用程序的所有配置設置。最初,我打算使用單例模式來允許每個對象引用站點對象的單個實例,但主要是由於此模式中涉及的測試問題,我決定嘗試一種不同的方法。OOPHP適合替代單身模式嗎?

我想使網站類的主父類在我的應用程序,並調用它的構造從子類的構造函數中,爲了使所有屬性可用的任何需要的時候。

第一次運行時,該類將只包含該應用程序的數據庫詳細信息。要獲取剩餘值,必須使用數據庫詳細信息執行查詢。但是,任何後續的實例都將是原始的克隆(包含所有值)。我也可以設置一個布爾標誌來再次執行查詢,需要一個全新的實例。

這是否是單身人士可行的替代方案,是否可以解決它導致的測試問題?這是所有理論ATM,我還尚未開始任何代碼,

不勝感激任何想法或建議。 謝謝。

+0

+1經常出現同樣的問題。非常有興趣聽到這裏會出現什麼。 – 2009-10-31 14:37:45

+0

單身人士遇到的測試問題是什麼? – 2009-10-31 14:42:45

+0

該技術不適用於鬆散耦合 – Dan 2009-10-31 14:48:24

回答

2

我認爲更好的辦法是有,將獲得傳遞給你的所有其他類的構造函數的「配置」的對象。所以,幾乎像單例一樣,除了它明確創建並僅傳遞給需要它的類。這種方法通常被稱爲dependency injection

2

嘗試許多不同的技術之後,我發現功能可靠是這個方法:

使用的引導,或初始化文件。它位於該網站的ROOT中,並具有適當的許可並保護其免受直接訪問。

網站中的所有頁面都首先包含此文件。在它內部,我創建了所有的全局對象(設置,用戶),並從那裏引用它們。

例如:

// OBJECT CREATION 
$Config = new Configuration(); 
$User = new User(); 

然後需要這些對象的類內:

public function __construct($id = NULL) { 
    global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION! 

    if($Config->allow_something) { 
     $this->can_do_something = true; 
    } 

    if(NULL !== $id) { 
     $this->load_record($id); 
    } 
} 

請注意,我剛剛從訪問這些全局對象的類中,我怎麼不有每次都包含對象變量作爲第一個構造函數參數。那變老了。

此外,擁有一個靜態數據庫類已經非常有用。我不必擔心傳球,我只能撥打$row = DB::select_row($sql_statement);;查看PhpConsole類。

UPDATE 感謝給予好評,誰就做。它呼籲關注我的回答不是我引以爲豪的事實。雖然它可能有助於OP完成他們想要的任務,但這不是一個好習慣。

傳遞對象到新對象構造是一個很好的做法(依賴注入),雖然「不方便」,就像生活中的其他事情,額外的努力是值得的。

我的答案的唯一可取之處的部分是利用門面模式(例如DB :: select_row())。這不一定是單身(OP是想要避免的),並且讓你有機會呈現精簡的界面。

Laravel是一個現代化的PHP框架,使用依賴注入和外觀以及其他久經考驗的設計模式。我建議任何新手開發人員仔細閱讀這些和其他這樣的設計實踐。