今日はフォームを作成していて、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で
PHPのスコープは、機能レベルです。 foreach()は新しいスコープを作成しません。つまり、$ b => $ bという2番目のバージョンの場合に作成される一時的な別名となります。しかし、それは新しい範囲が作成されているよりもPHP内部の副作用です。 –
スコープはループレベルではまったく行われていませんか? – EdgeCaseBerg
いいえ、phpには2つのスコープがあります。グローバル関数、およびローカル関数/メソッド。 –