PHP if,for,foreach等でのスコープと関数のスコープの違いについて

paizaの問題を解いていて、嵌ってしまいました…。

アウトプットがてら書き残しておきます。

if,for,foreach等の場合

PHPの場合、下記のコードの出力結果は、何になるでしょうか?

javaなどの言語を触ったことがある方なら、予想する出力結果としては、

100
0
1
2
3
100

と予想する方もいるかもしれません。

しかし、PHPではこのように出力されます。

最後の$iの値は100にならず、for文の値が引き継がれて、4になっているのがわかります。

つまり、PHPにはブロックスコープはなく、制御構造のブロックで定義された変数であっても、ブロックを抜けた後も使うことができます

また、PHPブロックの中はグローバルスコープとされ、別のPHPブロックや、ファイルでグローバルスコープに定義された変数は同じようにグローバルスコープとして使うことができます。

この仕様は思わぬバグを生むことがあるので注意が必要です。

私の場合は案の定、値が意図しないものになってしまって、そこそこ手間取りました…。

関数の場合

一方で、関数の場合はちゃんとスコープが機能します。

出力結果は、下記のとおりです。

クラスの場合も、同じようにローカルスコープが機能するので、、ローカルスコープ内で定義された変数は外からアクセスすることはできません。

参考になったサイトはこちらです

PHPでforeachなどを使う時の注意点。ブロックスコープのお話。

http://yoshikyoto.github.io/text/php/var_scope.html

https://yuukisakurai.com/programming/130/


メッセージ

CAPTCHA