11

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

のスコープが 2 つの変数のスコープをループas $value => $aに制限することを期待していたので、これはかなり奇妙に思えます。foreach

これが起こることです:

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

$aループのキーとして使用すると同じことが起こりますがforeach、さらに恐ろしいのはこの宝石でした:

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)

配列をその場で上書きし$bましたが、まだそのメンバーをループしています。

全体として、少し風変わりなようです。私の質問は、この動作が予想されることを指定するドキュメント/マニュアルを正確にどこで見つけることができるかを尋ねていますか?

4

2 に答える 2

10

PHP のスコープはグローバルまたは関数レベルであり、ブロック スコープはありません。http://php.net/manual/en/language.variables.scope.phpを参照してください。

于 2013-11-14T17:53:39.293 に答える
1

関数のみが新しいスコープを作成します。中括弧で形成されたブロックスコープは、新しいものを形成しません.あなたの例では、あなたはグローバルスコープにいます.

于 2013-11-14T17:56:35.363 に答える