2010-03-22 154 views
1

我們使用實例化並將系統關鍵對象放在$GLOBALS中,以便從任何地方(例如數據庫,緩存,用戶等)輕鬆訪問。將變量推入全局範圍?

我們使用$GLOBALS這麼多,如果我可以像$G = &$GLOBALS那樣爲速記調用引用它,那麼它肯定會降低代碼量。

問題是,根據我的經驗和幾個小時的谷歌搜索,我還沒有發現PHP中的任何構造,它允許您將var標記爲全局變量,使$GLOBALS變爲第一類,其他所有變成第二類。

我錯過了什麼嗎?這可能嗎?

回答

1
global $variable; //? 
+1

這隻會在建立的範圍內打開一個洞,它不會主動地突破子範圍。 – Spot 2010-03-22 09:36:18

2

而不是把一切都變成$GLOBALS的你可能想看看進入registry concept是在PHP世界普遍。

但是,具有許多全局變量/對象是設計不佳和高耦合的標誌。使用類似$G的東西保證了意大利麪代碼和即將到來的維護噩夢。誰在乎,如果你可以減少幾個字符的代碼量?

+0

我們不會將所有內容放在'$ GLOBALS'中。 '$ GLOBALS'中可能有八(8)個對象。如果某個系統很關鍵,因爲它在每個頁面上都是必需的,而且經常被訪問,我們把它放在'$ GLOBALS'中。 – Spot 2010-03-22 09:37:32

+0

爲什麼不在其他操作之前加載註冊表? – Benoit 2010-03-22 10:59:32

+0

如果你失望,請讓我知道爲什麼,我可以從我的錯誤中學習。 – middus 2012-06-12 07:26:32

2

沒有,但你可以使用一個小竅門。通過與全局變量相同的名稱創建一個全局函數,並讓它返回全局實例。例如:

function db() { 
    return $GLOBALS['db']; 
} 

現在,您可以編寫代碼爲:

... 
$stuffs = db()->query("select * from stuff"); 
... 

您可能認識到這是一個變體在單件模式,但語法更加愉快。

其他人已經提到過它,但你也應該考慮而不是首先使用全局對象。我通常更喜歡將對象傳遞到需要的地方(依賴注入)。儘管我沒有過多地發現註冊表模式。

+0

全球功能理念很有趣。它確實增加了對大多數系統調用的另一個函數調用,但這可能是值得的。 爲了清楚起見,我們在GLOBALS中的字面意思是有8個對象,並且它們是被_constantly使用的實例化對象。我們的系統是完全獨立的。我們根本不使用任何第三方代碼。在五年以後,我們實際上沒有任何問題。我理解對全球數據的擔憂,但這並不適用於此。 我們對全球數據非常謹慎。我們甚至把我們所有的控制器都關閉了,以保證安全。 :) 感謝您的答覆 – Spot 2012-06-12 00:28:43

4
<?php 

function &G($name) { 
    if(func_num_args() > 1) { 
     $GLOBALS[$name] = func_get_arg(1); 
    } 
    return $GLOBALS[$name]; 
} 


G('test', 'hey'); 

echo G('test'); // outputs hey 
echo $test; // outputs hey 

$b =& G('test'); 
$b = 'hello'; 

echo G('test'); // outputs hello 
echo $test; // outputs hello