スコープの認識を高めて安全なコードを書こう
こんにちは、
突然ですが、あなたは次のプログラムの最後のecho文で何が出力されるかわかりますか?
<?php $fruits = array( 'apple', 'banana', 'lemon' ); foreach($fruits as $fruit){ echo $fruit, PHP_EOL; } echo $fruit, PHP_EOL; //ここ! ?>
実行結果は、
apple banana lemon lemon //これ!
最後のecho文によってlemon
が出力されます。
僕はこの事実にびっくりしてしまいました。
この事実は知っていて損はないので説明していきます。
知った経緯
phpをつかうことになりそうなので、
体系的かつ実践的なものが学べると噂のパーフェクトPHPで勉強しています。
勉強開始いきなり、スコープの話がでてきたのですが衝撃を受けてしまいました。
スコープとは
スコープとは、一言で言うと、
変数を参照することができる範囲
のことです。
なぜ衝撃をうけたか
最初に例をあげたプログラムでは、
最後のecho文で変数$fruit
を参照しています。
僕の勘違いはこの変数のスコープでした。
$fruit
のスコープはforeach文の中だけだという認識でいました。
これが実は違うのです。
foreach文で宣言された$fruit
はグローバルスコープなのです。
グローバルスコープと言ってしまうと誤解を招きそうなので補足しておきます。
関数定義などのローカルスコープでforeach文で定義した場合は、
foreach文内だけでなく、関数内であれば参照できます。
関数内のforeach文で定義された変数はグローバルスコープではないでしょう。
僕が言いたいのは、
foreach文で定義した変数は、foreach文の外にも影響してるよ!
ってことです。
まとめ
今回はパーフェクトPHPを読んでいて衝撃を受けたことをアウトプットしました。
てっきり変数が自分の思ってたスコープ内だけだと思っていると、思いも寄らないエラーを引き起こしそうですね。
みなさんもスコープの認識を高めて安全なコードを書きましょう!