2017-10-06 2 views
-1

:(未設定のグローバル変数の場合のunset()のような動作が他の操作でも同じではないのはなぜですか?未設定()関数のPHPのドキュメントを1として

行動)は、関数の内部では、破棄しようとする変数の種類によって異なります。 グローバル化された変数が関数内でunset()されている場合、ローカル変数のみが破棄されます。呼び出し環境の変数は、unset()が呼び出される前と同じ値を保持します。ことわざの上実証

のコード例は以下の通りです:

<?php 
function destroy_foo() 
{ 
    global $foo; 
    unset($foo); 
} 

$foo = 'bar'; 
destroy_foo(); 
echo $foo; // o/p is bar 
?> 

上記の行動は、私が書いたプログラムを以下では適用されない理由を今私の質問はありますか?動作がunset()機能のために書かれたコードでの動作よりも上記のコードでは異なっている理由

<?php 
function increment_foo() 
{ 
    global $foo; 
    $foo++; 
} 

$foo = 36; 
increment_foo(); 
echo $foo; // o/p is 37 
?> 

私の疑いがありますか?

つまり、最初のコードでunset()の機能が関数内のローカル変数に限定されていることを知りたいのですが、関数外のグローバルスコープの値は変更されませんが、増分機能によって、グローバル変数スコープ内の値も変更されます。なぜ私のコードでは、関数内のローカル変数と値の変更に制限されず、関数外の変数にも影響しますか?

ありがとうございます。

+0

はスコープの問題のようです – rtfm

+1

それはどのように動作し、どのように文書化されているかです。それを除いて、それは私にとってかなり論理的なようです:グローバル変数への参照のようなので、それを解除し、参照を解除し、グローバル変数を変更します。本当の疑問はなぜあなたがグローバル変数を使用するかということです;-) – jeroen

答えて

2

この理由は、globalキーワードを使用すると、グローバルスコープ内の変数を参照するローカル変数が作成されるためです。設定を解除すると、この参照が破棄されます。

$foo = 42;  // create variable with value 
$bar = &$foo; // create reference to $foo 
$bar++;   // increment $foo via reference 
unset($bar); // destroy reference 

var_dump($bar); // NULL 
var_dump($foo); // 43 

$foo = &$GLOBALS['foo']を行うことがglobal $fooをやってすることは簡単な表現であるということです置くための別の方法、例えば:それは、コードのこの作品に似ています最初の例は、多分それはあなたが唯一の、例えば参照を破壊していることがより明確ことになり

function increment_foo() 
{ 
    $foo = &$GLOBALS['foo']; 
    $foo++; 
    unset($foo); 
    var_dump($foo); // NULL 
} 

$foo = 42; 
increment_foo(); 
var_dump($foo); // 43 

に書き換えることができます。あなたは$fooを指していますが、$fooは指摘していません。

関連する問題