2013-11-14 20 views
8

今日はフォームを作成していて、foreachループで後で使用される名前と同じ名前の変数名を指定していました。私の驚いたことに、foreachループの宣言は変数の前の宣言を上書きしました。foreachのforeachの同じ名前が上書きされる

私には、as $value => $aの範囲がforeachループに2つの変数の範囲を限定することを期待していたので、これはむしろ奇妙に思えます。

これは何が起こるかです:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; }; 
123 
php > echo $a; 
3 

これは私が期待したものである:

php > $a = 5; //define a in outer scope 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; /* This $a should be the one from the foreach declaration */ }; 
123 
php > echo $a; //expecting inner scope to have gone away and left me to get the outer scoped $a 

同じことは、私はforeachループのキーとして$aを使用する場合は、より多くの恐ろしいが、この宝石だっ起こります:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $a => $b){ var_dump($b); } 
int(1) 
int(2) 
int(3) 
php > var_dump($b) // => int(3) 

を上書きした0の配列を配置し、それでもメンバーをループします。

やや奇妙な感じです。私の質問は、この動作が期待されることを明記するマニュアル/マニュアルがどこにあるのかを尋ねていますか? PHPで

+7

PHPのスコープは、機能レベルです。 foreach()は新しいスコープを作成しません。つまり、$ b => $ bという2番目のバージョンの場合に作成される一時的な別名となります。しかし、それは新しい範囲が作成されているよりもPHP内部の副作用です。 –

+0

スコープはループレベルではまったく行われていませんか? – EdgeCaseBerg

+0

いいえ、phpには2つのスコープがあります。グローバル関数、およびローカル関数/メソッド。 –

答えて

1

のみの機能を参照し、新しいスコープを作成します。中括弧で囲まれたブロックスコープは新しいスコープを形成しません。あなたの例では、グローバルスコープにあります。

関連する問題