2011-09-15 11 views
3

は、次の2つの例を見てください:

例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(); 

どちらも思えます同じことをするには?違いはなんですか?他のものよりも良い方法ですか?なぜこれを行うには2つの異なる方法がありますか?

最初の例は、宣言の後に変数を割り当てずに使用するように見えるので、私にとっては奇妙に見えます。

ありがとうございます。

+0

[グローバルを使用しない](http://stackoverflow.com/questions/5166087/global-in-functions/5166527#5166527) –

+0

グローバルは常に悪くはありません。私はOracle DBへの接続を行うconfig.inc/config.phpファイルを書いています。このファイルでは、接続は変数に割り当てられます。クエリを実行するには、この変数にアクセスする必要があります。そうでなければ、接続を続けなければなりません。それは有効な使用権ですか?そうでないか教えてください。 – ale

+0

ではありません。私がここにリンクした答えは、非常に有用な記事への言及を持っています - それはそれらを読む時間を無駄にすることはありません。あなたの場合、依存症注入(http://en.wikipedia.org/wiki/Dependency_injection)または[DI容器](http://martinfowler.com/articles/injection.html)が必要です。 –

答えて

6

キーワードは変数をローカルスコープにインポートしますが、グローバルには$GLOBALSでアクセスします。

2

$GLOBALSは、グローバル変数にアクセスする他の方法です。 globalキーワードは、グローバル変数をローカルスコープにインポートします。 $GLOBALSは、ローカルスコープを汚染することなくグローバル変数にアクセスするために使用できます。

たとえば、グローバル変数を反復するために使用できます。

$GLOBALSを参照してください:

$ GLOBALS - 参考グローバルスコープで利用可能なすべての変数

そしてthe global keyword:関数内でグローバルbは$ aと$を宣言することで

を、いずれかの変数への参照はすべてグローバルバージョンを参照します。

グローバルスコープから変数にアクセスするもう1つの方法は、特別なPHP定義の$ GLOBALS配列を使用することです。

+1

副作用はありますか?それはまさにそのためのものではありませんか? – hakre

1

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を使用すると、ローカル変数テーブル内のグローバル変数テーブルの一部である1つ以上の変数ラベルを指定できます。他の回答では、とよく呼ばれます。

関数スコープ内で$GLOBALSがグローバルテーブルを直ちに更新しなかったときもありました。しかし、私はそれが今修正されたと思う。少なくとも私はもうそれを再現できませんでした。

したがって、違いは単なる何かを書く方法の意味に過ぎません。

ただし、この2つの違いがあります。グローバル変数を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を参照してください。 PHPマニュアルから

関連する問題