MORITOMOMENT

登山好きエンジニアのテックブログ

プログラミング・アウトドア関連を中心に発信

スコープの認識を高めて安全なコードを書こう

こんにちは、

突然ですが、あなたは次のプログラムの最後の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で勉強しています。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

パーフェクトPHP (Perfect series) [ 小川雄大 ]
価格:3888円(税込、送料無料) (2019/4/21時点)


勉強開始いきなり、スコープの話がでてきたのですが衝撃を受けてしまいました。

スコープとは

スコープとは、一言で言うと、

変数を参照することができる範囲

のことです。

 なぜ衝撃をうけたか

最初に例をあげたプログラムでは、

最後のecho文で変数$fruitを参照しています。

僕の勘違いはこの変数のスコープでした。

$fruitのスコープはforeach文の中だけだという認識でいました。

これが実は違うのです。

foreach文で宣言された$fruitはグローバルスコープなのです。

グローバルスコープと言ってしまうと誤解を招きそうなので補足しておきます。

関数定義などのローカルスコープでforeach文で定義した場合は、

foreach文内だけでなく、関数内であれば参照できます。

関数内のforeach文で定義された変数はグローバルスコープではないでしょう。

僕が言いたいのは、

foreach文で定義した変数は、foreach文の外にも影響してるよ!

ってことです。

まとめ

今回はパーフェクトPHPを読んでいて衝撃を受けたことをアウトプットしました。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

パーフェクトPHP (Perfect series) [ 小川雄大 ]
価格:3888円(税込、送料無料) (2019/4/21時点)


てっきり変数が自分の思ってたスコープ内だけだと思っていると、思いも寄らないエラーを引き起こしそうですね。

みなさんもスコープの認識を高めて安全なコードを書きましょう!