PHPのスコープとは?グローバル・ローカル・スーパーグローバルを完全解説!
生徒
「先生、PHPのスコープって何ですか?すごく難しそうに聞こえます…」
先生
「心配しなくても大丈夫!スコープは、変数の見える範囲のことなんだよ。今日は、グローバルスコープ、ローカルスコープ、スーパーグローバルスコープについて、一緒に見ていこう!」
生徒
「なるほど!それぞれどんな意味なんですか?」
先生
「よし、ゆっくりと例え話も交えて説明するから安心して聞いてね!」
1. スコープ(Scope)とは?
PHPのスコープとは、変数(データを入れる箱のようなもの)がどこから見えるか、どこで使えるかを示す範囲のことです。プログラムの中で、「どの場所で変数が見えるか・使えるか」を決めるとても大事な考え方なんですよ。
例えば、家の中の「冷蔵庫」を思い浮かべてみましょう。家族だけが見られる冷蔵庫の中身は「ローカルスコープ」、家の外の人にも見せられる大きな掲示板のようなものは「グローバルスコープ」、そして町内掲示板みたいにどこでも見える特別な情報は「スーパーグローバルスコープ」と考えるとわかりやすいですね。
2. ローカルスコープとは?
まずは「ローカルスコープ」から説明します。ローカルスコープとは、関数やメソッドの中だけで使える変数のことです。関数の外からは見えないので、まるで「家族だけが見える冷蔵庫の中身」のようなイメージです。
関数とは、プログラムの中で特定の作業をまとめて行う小さな箱のようなもの。PHPでは、下記のように関数を作ります。
function myFunction() {
$localVariable = "これはローカルスコープです";
echo $localVariable;
}
myFunction();
この例では、$localVariable
という変数はmyFunction
という関数の中でしか使えません。関数の外からは見えないので、「関数のプライベート空間」と言えます。
3. グローバルスコープとは?
次に「グローバルスコープ」について説明しましょう。グローバルスコープとは、関数の外で作られた変数のことです。プログラム全体で使えるので、みんなが見られる大きな掲示板のようなものです。
ただし、関数の中からグローバルスコープの変数を見るには少し工夫が必要です。PHPでは、global
キーワードを使ってグローバル変数を関数内で使えるようにします。
$globalVariable = "これはグローバルスコープです";
function showGlobal() {
global $globalVariable;
echo $globalVariable;
}
showGlobal();
このように、global
と書くことで、関数の中でもグローバル変数にアクセスできます。
4. スーパーグローバルスコープとは?
最後に「スーパーグローバルスコープ」についてお話しします。スーパーグローバルスコープとは、PHPで特別に用意されている変数で、どこからでもアクセスできる便利な変数たちです。スーパーという名前の通り、最強の掲示板のような存在ですね。
例えば、$_GET
や$_POST
、$_SESSION
などがスーパーグローバル変数です。これらは、Webページに送られたデータを簡単に取り出すことができます。
実際の例を見てみましょう。
echo $_GET["name"];
この例では、WebページのURLに?name=太郎
と書かれている場合に、「太郎」という文字を取り出して表示できます。
5. どうしてスコープが大切なの?
「スコープってなんでそんなに大切なの?」と思うかもしれませんね。スコープを正しく使わないと、プログラムが思った通りに動かなくなることがあります。たとえば、関数の外で作った変数を勝手に書き換えてしまうと、他の部分でエラーが起きることもあります。
だから、「この変数はどこから見えるのか?」をしっかり意識してプログラムを書くことがとても重要なんです。
6. スコープをイメージで覚えよう
もう一度例え話を使ってまとめます。
- ローカルスコープ:家族だけが知っている冷蔵庫の中身
- グローバルスコープ:家族全員が見える家の掲示板
- スーパーグローバルスコープ:町中みんなが見られる町内掲示板
これを覚えておけば、スコープがどんな意味か頭に入りやすくなりますよ。
7. PHPのスコープに関するポイントまとめ
PHPのスコープは、「ローカル・グローバル・スーパーグローバル」の3つをしっかり理解するのが大切です。
まずは、小さな関数の中で使うローカルスコープから練習して、慣れてきたらグローバルやスーパーグローバルに挑戦するといいですよ。
実際にプログラムを書いてみると、スコープの違いがよくわかります。これから少しずつ慣れていきましょう!