我們使用實例化並將系統關鍵對象放在$GLOBALS
中,以便從任何地方(例如數據庫,緩存,用戶等)輕鬆訪問。將變量推入全局範圍?
我們使用$GLOBALS
這麼多,如果我可以像$G = &$GLOBALS
那樣爲速記調用引用它,那麼它肯定會降低代碼量。
問題是,根據我的經驗和幾個小時的谷歌搜索,我還沒有發現PHP中的任何構造,它允許您將var標記爲全局變量,使$GLOBALS
變爲第一類,其他所有變成第二類。
我錯過了什麼嗎?這可能嗎?
我們使用實例化並將系統關鍵對象放在$GLOBALS
中,以便從任何地方(例如數據庫,緩存,用戶等)輕鬆訪問。將變量推入全局範圍?
我們使用$GLOBALS
這麼多,如果我可以像$G = &$GLOBALS
那樣爲速記調用引用它,那麼它肯定會降低代碼量。
問題是,根據我的經驗和幾個小時的谷歌搜索,我還沒有發現PHP中的任何構造,它允許您將var標記爲全局變量,使$GLOBALS
變爲第一類,其他所有變成第二類。
我錯過了什麼嗎?這可能嗎?
global $variable; //?
而不是把一切都變成$GLOBALS
的你可能想看看進入registry concept是在PHP世界普遍。
但是,具有許多全局變量/對象是設計不佳和高耦合的標誌。使用類似$G
的東西保證了意大利麪代碼和即將到來的維護噩夢。誰在乎,如果你可以減少幾個字符的代碼量?
除了註冊表概念Middus指出,有幾種方法和概念解決這個問題,其中一些可以在答案找到了這個問題:
In a PHP project, how do you organize and access your helper objects?
沒有,但你可以使用一個小竅門。通過與全局變量相同的名稱創建一個全局函數,並讓它返回全局實例。例如:
function db() {
return $GLOBALS['db'];
}
現在,您可以編寫代碼爲:
...
$stuffs = db()->query("select * from stuff");
...
您可能認識到這是一個變體在單件模式,但語法更加愉快。
其他人已經提到過它,但你也應該考慮而不是首先使用全局對象。我通常更喜歡將對象傳遞到需要的地方(依賴注入)。儘管我沒有過多地發現註冊表模式。
全球功能理念很有趣。它確實增加了對大多數系統調用的另一個函數調用,但這可能是值得的。 爲了清楚起見,我們在GLOBALS中的字面意思是有8個對象,並且它們是被_constantly使用的實例化對象。我們的系統是完全獨立的。我們根本不使用任何第三方代碼。在五年以後,我們實際上沒有任何問題。我理解對全球數據的擔憂,但這並不適用於此。 我們對全球數據非常謹慎。我們甚至把我們所有的控制器都關閉了,以保證安全。 :) 感謝您的答覆 – Spot 2012-06-12 00:28:43
<?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
這隻會在建立的範圍內打開一個洞,它不會主動地突破子範圍。 – Spot 2010-03-22 09:36:18