スコープとは?
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
スコープとは?
結論から先に言うと、
スコープというのは、変数や関数などの「有効範囲」のことです。
プログラムを作る際は、多くのソースコードを作り、さらに1つ1つのソースコードの中にも、
if文やfor文のような制御構造や、関数が定義されたりと、細かい構造に分かれています。
このとき、ある場所で定義された変数が、どこから参照可能なのか?という有効範囲のことを「スコープ」といいます。
例えば「$a」という変数を定義した場合、スコープの範囲内であればこの変数を使うことができますが、スコープの範囲外から使おうとすると「そんな変数はありません」とエラーになるということですね。
スコープはなぜ必要?
なんだか面倒くさそうなので、「定義した変数は、全ての場所から利用できるようにすればいい」と思ってしまいますが、そうするとどうなるでしょう。
例えば、別の場所でたまたま同じ名前の変数を作ってしまった場合に、予期しないところで値が書き換えられてしまってバグの元になったり、ソースコードを書くときも、「もしこの変数の値を書き換えたら、一体どこまで影響が及ぶんだろう?」と常に考えながらプログラミングするのはとても大変です。
1人で開発しているならまだ良いですが、チーム開発の場合はさらに大変ですよね。
そこで、プログラミングでは、
予期しない誤動作が起こることを防いだり、変数の影響範囲が「ぱっと見で」すぐ分かるようにするために、影響範囲はできるだけ狭くするというのが基本的な考え方になっています。
スコープはそのために必要なんです。
スコープの種類
スコープは、扱うプログラミング言語によって仕様が異なりますが、共通的な考え方として、「グローバルスコープ」と「ローカルスコープ」というものが存在します。
グローバルスコープは、プログラムの全体から参照できるスコープのことです。
グローバルスコープの変数(グローバル変数)は、プログラムのどこからでも使うことができます。
対して、ローカルスコープは、ある関数や制御構造のブロックの範囲内だけに限定されたスコープのことです。
ローカルスコープの変数(ローカル変数)は、その範囲内でしか使うことができません。
PHPでのスコープ
PHP言語の場合は、PHPブロックの中で直接定義した変数は、PHPファイルのどこからでも参照可能です。
これは、グローバル変数という訳ですね。
このように、関数を定義すると、関数の中は隔離された空間となっており、関数の中で定義した変数は、この中でしか使うことができません。
これは、ローカル変数という訳ですね。
なお、関数の中でグローバル変数にアクセスしたい場合は「global」というキーワードを付けます。
また、PHPではもう1つ「スーパーグローバル」という、あらかじめPHPにより用意された特別な変数もあります。
例えば、
リクエスト情報などを保持する「$_SERVER」
セッションデータを保持する「$_SESSION」
リクエストパラメーターを保持する「$_GET」や「$_POST」
などが用意されており、スーパーグローバルは、PHPプログラムのどの場所からでもアクセスすることができます。
まとめ
・スコープとは、変数や関数などの「有効範囲」のこと
・有効範囲があることで、予期せぬ誤動作を防ぎ、ソースコードの可読性が上がる
・スコープの仕様はプログラミング言語によって異なる
・PHPの場合は「ローカル」「グローバル」「スーパーグローバル」というスコープがある
プログラムを書くときは、スコープを意識しておかないと、使おうと思った変数が使えなかったり、逆に想定外の変数に値を入れてしまったりなどバグの元になります。
言語のスコープの仕様をしっかり確認するようにしましょう!