2010-09-16 76 views
2

我有一個我在我的代碼中遍佈的地方使用的類。它包含設置和其他核心功能。以下是我現在正在使用該課程的內容。好主意或壞主意?使用靜態類變量來存儲全局

$settings = new Settings(); 
$settings->loadSettings(); 

然後,當我需要在其他類中的一些隨機函數的代碼,我做這樣的事情:

function abc() { 
    global $settings; 
    $variable = $settings->a; 
} 

我厭倦了各地隨機調用全局$設置拉入該設置對象的地方。我不想使用$ _GLOBALS數組(我不知道爲什麼,我只是不想)。

我在想我想切換到一個名爲$設置裏面的靜態類變量的設置。該代碼是這樣的:

Settings::$settings = new Settings(); 
Settings::$settings->loadSettings(); 

然後,每當我想使用它,我從來不擔心在通過全球運營商吸吮它:

function abc() { 
    $variable = Settings::$settings->a; 
} 

好主意還是壞主意?

+0

[從類和腳本訪問全局對象(如數據庫或日誌)的最佳方式?](http://stackoverflow.com/questions/1967548/best-way-to-access-global-objects- like-database-or-log-from-classes-and-scripts) – Wrikken 2010-09-16 23:08:20

回答

8

嗯,它可能是全局的改進,因爲它解決了全局導致的所有醜陋的範圍問題。擺脫全球運營商通常是件好事!你在做什麼和單身模式沒有什麼不同,儘管它比較簡單。 (有關該模式的更多信息,請參見http://php.net/manual/en/language.oop5.patterns.php上的「Singleton」部分。)您的解決方案几乎可以滿足您的需求。

另一方面,可能有更好的方法來實現同樣的事情,更多地解耦你的代碼。也就是說,每個班級在沒有重新編碼的情況下變得更有能力在另一個項目中使用。這樣做將是「注入」的一種方式設置對象爲每個類:

class ABC { 
    private $settings; 

    public function __construct($settings) { 
     $this->settings = $settings; 
    } 

    public function someMethod() { 
     $variable = $this->settings->a; 
    } 
} 

這將是更多的工作,但可以提高代碼的可重用性。例如,您可以爲每個項目編寫不同的設置類,但使用相同的ABC類。

這個過程中,「注入」一個對象到依賴於它的另一個對象中,稱爲依賴注入。還有其他更復雜的方法,包括複雜的容器。請參閱http://fabien.potencier.org/article/11/what-is-dependency-injection以獲取有關該主題的一組有趣的教程。它們可能與您當前的需求相關,但現在或將來都可能有所幫助。

+0

非常感謝你的回答。 – 2010-09-16 23:28:52

+0

但是這樣做,我們必須用全局實例編寫更長的代碼,這裏是'$ setting',而不是使用'$ settings',對吧?我沒有看到這樣做的好處,爲什麼人們避免使用'global'關鍵字?在聲明實例時,你可以在'__construct'全局獲取'$ settings'而不是傳遞對象,在這種情況下使用引用會更好? '$ this-> settings =&$ settings'是否有助於減少內存使用量? – TomSawyer 2016-11-08 17:26:36

1

看來您在尋找一個Singleton。基本上這個想法是有一個具有公共靜態方法getInstance()的類,它返回類本身的一個實例。第一次調用該方法時,它將該實例存儲在一個私有屬性中,並且稍後它將返回存儲的實例。通過這種方式,只要您調用Settings :: getInstance(),就可以保證擁有相同對象的副本。然後你可以在這個對象中存儲設置。

+0

-1:在這種情況下,靜態類和單例之間沒有區別。 – 2011-04-26 14:01:20

+0

是的,有一個,那是一個(可能是另一個程序員)無法錯誤地創建另一個設置實例,而不是使用Settings :: $設置的事實。單身模式所做的就是強制執行這個約定。 – Andrea 2011-04-26 15:00:13

+0

單身人士是反模式,不應該使用。 http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/ – 2011-04-26 18:04:34

相關問題