paizaの問題を解いていて、ハマってしまいました…。
アウトプットがてら書き残しておきます。
if,for,foreach等の場合
PHPの場合、下記のコードの出力結果は、何になるでしょうか?
1 2 3 4 5 6 7 8 9 10 |
$i =100; echo $i.PHP_EOL; for($i=0;$i<=3;$i++){ echo $i.PHP_EOL; } echo $i.PHP_EOL; |
javaなどの言語を触ったことがある方なら、予想する出力結果としては、
100
0
1
2
3
100
と予想する方もいるかもしれません。
しかし、PHPではこのように出力されます。
1 2 3 4 5 6 |
100 0 1 2 3 4 |
最後の$iの値は100にならず、for文の値が引き継がれて、4になっているのがわかります。
つまり、PHPにはブロックスコープはなく、制御構造のブロックで定義された変数であっても、ブロックを抜けた後も使うことができます。
また、PHPブロックの中はグローバルスコープとされ、別のPHPブロックや、ファイルでグローバルスコープに定義された変数は同じようにグローバルスコープとして使うことができます。
この仕様は思わぬバグを生むことがあるので注意が必要です。
私の場合は、値が意図しないものになってしまってそこそこ手間取りました…。
関数の場合
一方で、関数の場合はちゃんとスコープが機能します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$i=100; echo $i.PHP_EOL; function huga(){ $i=1; echo $i.PHP_EOL; } huga(); echo $i.PHP_EOL; |
出力結果は、下記のとおりです。
1 2 3 |
100 1 100 |
クラスの場合も、同じようにローカルスコープが機能するので、、ローカルスコープ内で定義された変数は外からアクセスすることはできません。
参考になったサイトはこちらです

PHPでforeachなどを使う時の注意点。ブロックスコープのお話。
PHPにはブロックスコープがないので、foreachなどループ内でセットした変数でもループを抜けた後、変数に値…
PHPではまりやすい変数のスコープ - @yoshiki_utakata
https://yuukisakurai.com/programming/130/
コメント