2013-01-10 39 views
4

可能重複:
Registry design pattern…good or bad?PHP全局變量的一切?

我正在使用PHP遊戲腳本,並正在接近它以類似的方式如何,我建我的許多網站。我有一個聲明單個變量的習慣,這個變量是一個stdClass,它包含許多對執行很重要的其他變量。然後,如果我需要一個函數內部的東西(如果它沒有傳入參數),我只需使用全局$變量,在這種情況下$ ar。

$ar = new stdClass; 
$ar->i = new stdClass; 
$ar->s = new stdClass; 

$ar->i->root = "/home/user"; 

/* Directory where log files are to be stored. */ 
$ar->i->logs = "{$ar->i->root}/logs"; 

/* Directory where the banlist is. */ 
$ar->i->bl = "{$ar->i->root}/customize/settings/bannedaccounts.txt"; 

/* Directory where the silencelist is. */ 
$ar->i->sl = "{$ar->i->root}/customize/settings/silencedaccounts.txt"; 

/* How many points should be awarded for 1st place, 2nd place... etc. */ 
$ar->s->points = array(10, 7, 5, 4, 3, 2, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1); 

所以,如果我要在函數中使用上述變量之一,我會這樣處理它。

public function run() { 
    global $ar; 
    //do something with the variable.. 
} 

有人會建議不要這樣做嗎?使用單個變量並將其包含在很多函數中是一種不好的做法以避免?我知道創建一些只能使用參數的函數是可取的,但我問的是PHP的性能,而不是編程的清晰度。謝謝!

+3

這是[Registry Pattern](http://martinfowler.com/eaaCatalog/registry.html)。總是有更好的方法 – Phil

回答

1

一起來表示對象的數據元素應該是一個對象。如果你有不相關的東西,不要把它放在同一個對象中。

如果您需要全局範圍(通常不需要),則可以使用$GLOBALS。不過,我建議你遵循面向對象的原則,對於大多數項目。至少使用功能參數。

如果您有需要這些變量(或者,即使只是run()!)的函數庫如run(),也有一個實用程序類,其中這些變量是該類的成員。

+0

好吧,我通常做的是將我的引擎(幾乎像庫)存儲在全局變量中,所以我使用了例如'$ ar-> e-> db = new Database();但是 那麼裏面的所有內容都將變成'$ ar-> e-> db-> variable'的變量。我喜歡這樣的工作,但我不確定這是否是一種不好的做法。 – Tristan

+1

沒有必要這樣做。如果你想要一個真正的全局數據庫連接(在某些情況下可以使用),那麼使用'$ GLOBALS'。 – Brad