2011-08-08 19 views
1

PHP関数の戻り値の予期しない

$bar = "outside"; 
function foo($bar) { 
    $bar = "inside"; 
    return $bar; 
} 
$bar = foo($bar); 
echo $bar 

私は$バーは「外側」エコーだろうと予測、それは「内部の」エコーと私はなぜ表示されません。 $ barの値は最初は "outside"(グローバルとして定義)です。関数fooは(定義された直後に)呼び出され、$ barと呼ばれることもあるパラメータをとります。 $ barに値 "outside"が与えられたので、 "outside"という値がfooに渡されます。それで、私たちは文章$ bar = "inside"を持っています。これは "outside" = "inside"を意味するように思えますし、別の文字列にどのように文字列を割り当てることができますか?それから関数は$ barを返します。これはfooに渡された値なので、 "outside"という値を持つはずです。それがどのように「内部」の価値を得たのか分かりません。

を編集してください:私の質問は可変範囲ではありません。私が疑問に思っているのは、パラメータ値が3行目の関数に渡されず、無意味なステートメントが "outside" = "inside"になってしまうことです。私が得た答えに基づいて、私はそのような文がPHP(およびおそらく他のすべての言語)では違法であると仮定することしかできないので、インタプリタは単にこれをしません(通訳者のの通常のの動作関数本体内のどこにでもパラメータを代入することです)。

+1

:[変数のスコープ](HTTP:// PHP。 net/manual/en/language.variables.scope.php) - それを最初に理解する必要があります。これは、多くの多くのコンピュータ言語での非常に基本的な原則です。 – hakre

+0

あなたはその機能で必要なものについてもっと明確にすべきです。 –

+0

@hakre:私の質問は可変スコープと関係がありません。私はこの問題に対処するのに十分な範囲を理解しています。私の混乱が起こっているところでは、なぜそのようなパラメータ値が通常代入されるかという、3行目のローカル変数$ barの代わりにパラメータ値 "outside"が使われないのです。言い換えれば、私は、パラメータ値が関数に渡されない場合に遭遇したように見えます。 – Bill

答えて

1

あなたのライン$bar = "inside";$barの再割り当て値です、ありがとうございました。したがって、あなたが渡す価値にかかわらず、$barには値"inside"が割り当てられます。

関数が実行を開始すると、変数$バーは関数に対してローカルである(あなたは」:

+0

はい、3行目で関数内のローカル変数$ barに代入された値 "outside"はありませんか?それは "outside" = "inside"というステートメントを作成します。これが私を混乱させます。 – Bill

+0

いいえ、代入演算子( '=')の左側の変数は、代入の受信側に常にあります。評価されず、再代入されるだけです。 –

1

まあ、そう私は刺してみましょう私はPHPの専門家だが、私はいくつかの他の言語で働いてきました3行目のグローバル$バーを参照しないでください)。このローカル変数を "inside"に設定して返します。グローバル$バーは、その戻り値の "inside"に設定されます。

あなたに関数宣言を変更する場合は、この作品を見ることができます:あなたは、私が何かを追加したい他の質問に投稿してきたコメントに基づいて

function foo($bid) { 
    $bid = "inside"; 
    return $bid; 
} 

あなたが表示されたら " $ bid "コードのどこかで、変数の代入ではなく変数の評価が行われます。この "評価"の右側に等号がある場合、コンパイラは "評価しない、設定する"ことを知っています。一方、等号が変数の左側にある場合は評価されます。コンパイラは、変数が等号の左辺または右辺にあるときに、関数を異なる方法で認識します。

+0

ええ、私はまだ関数に渡される値に何が起こるのか混乱しています。 "outside"がfooに渡されるので、fooの中にある$ bar(または$ bid)が "outside"に置換されることはありませんか?それは混乱する代入文 "outside" = "inside"を与えます; – Bill

+1

いいえ、それほどではありません。 PHPと他の言語は、まったく同じように動作しません。あなたが代数で見るような値の代用ではありません。 3番目の行が言っていることは、 "変数$ barを"内側 "に"設定しない ""外側に "を"内側に "設定しない" –

0

1:

$bar = "outside"; 
function foo($bar) { 
    $bar = "inside"; 
    return $bar; 
} 
$bar = foo($bar); 
echo $bar // **echo's inside** 

2:

$bar = "outside"; 
function foo($bar) { 
    GLOBAL $bar; 
    $bar = "inside"; 
    return $bar; 
} 
$bar = foo($bar); 
echo $bar // **echo's inside** 

3:これは、ここで(例で)説明する

$bar = "outside"; 
function foo($bar) { 

    $bar = "inside"; 
    GLOBAL $bar; 
    return $bar; 
} 
$bar = foo($bar); 
echo $bar // **echo's outside** 
関連する問題