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

php

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

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

if,for,foreach等の場合

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

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

100
0
1
2
3
100

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

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

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

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

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

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

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

関数の場合

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

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

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

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

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

コメント

タイトルとURLをコピーしました