2011-09-15 99 views
3

請看下面的兩個例子:

實施例1:

$variable = 'some value'; 

class Foo { 
    public function bar() { 
     global $variable; 
     print $variable;  
    } 
} 

實施例2:

$variable = 'some value'; 

class Foo { 
    public function bar() { 
     print $GLOBALS['variable']; 
    }  
} 

實例可以使用這樣的:

$foo = new Foo(); 
$foo->bar(); 

兩者似乎做同樣的事情?有什麼不同?比其他方式更好嗎?爲什麼有兩種不同的方式來做到這一點?

第一個例子對我來說似乎很陌生,因爲它看起來像一個聲明,然後使用該變量而不指定它..看起來很奇怪。

謝謝。

+0

[do not use globals](http://stackoverflow.com/questions/5166087/global-in-functions/5166527#5166527) –

+0

Globals並不總是不好。我寫了一個config.inc/config.php文件,它連接到Oracle數據庫。在這個文件中,連接被分配給一個變量。要做查詢,我需要訪問這個變量,否則我必須繼續進行連接。所以這是一個有效的使用權利?告訴我,如果不是。 – ale

+0

不是。我在這裏鏈接的答案提到了非常有用的文章 - 閱讀它們不會浪費時間。對於你的情況,你需要[依賴注入](http://en.wikipedia.org/wiki/Dependency_injection)或[DI容器](http://martinfowler.com/articles/injection.html)。 –

回答

6

global關鍵字'imports'變量放到本地作用域中,而訪問全局通過$GLOBALS則不能。

2

$GLOBALS只是訪問全局變量的另一種方式。關鍵字global將全局變量導入本地作用域。 $GLOBALS可用於訪問全局變量而不污染本地範圍。例如,可以使用它來遍歷全局變量。

$GLOBALS

$ GLOBALS - 引用全局範圍

而且the global keyword可用的所有變量:

通過在函數內部聲明$ a和$ b全球,對任一變量的所有引用都將引用全局版本。

從全局範圍訪問變量的第二種方法是使用特殊的PHP定義的$ GLOBALS數組。

+1

副作用?這不完全是爲了什麼嗎? – hakre

1

一個區別在於使用。從manual page

<?php 
function test() { 
    $foo = "local variable"; 

    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n"; 
    echo '$foo in current scope: ' . $foo . "\n"; 
} 

$foo = "Example content"; 
test(); 
?> 

你可以看到,你可以訪問此,全局變量和局部變量。你在使用global $foo時不能這樣做。還有其他的不同之處,但我認爲沒有什麼關係。

你可能想問問自己,無論如何你應該使用全局變量,它的使用方式幾乎總是一種反模式,就我而言,儘管這可能是一種嘗試。

1

$GLOBALS表示形式爲Array的整個全局變量表。

關鍵字global允許您指定一個或多個變量標籤,它們是局部變量表中全局變量表的一部分。在其他答案中經常被稱爲導入

曾經有一段時間,函數作用域中的$GLOBALS沒有立即更新全局表。但我認爲現在已經解決了。至少我無法再重現它。

所以區別僅僅在於如何寫東西的語義。

但是,兩者之間有所不同。當您通過global關鍵字在本地範圍內訪問全局變量時,您無法取消設置全局變量。

$var = 1; 
foo(); 

function foo() 
{ 
    global $var; 
    unset($var); # won't unset the global variable 
} 

但您可以通過$GLOBALS訪問它們。

$var = 1; 
foo(); 

function foo() 
{ 
    unset($GLOBALS['var']); # unsets the global variable 
} 

這是非常具體的,如果感興趣,請參閱Demo

相關問題