第16回 変数のスコープとデータ型 - PHP基礎講座
Saity先生のPHP基礎講座
Lecutures on PHP
第16回 変数のスコープとデータ型 (その1)
- クリスマスはどうでしたか?
- いやぁ~、前回話したとおり、友達と一緒にコーディング大会をしていたよ。楽しかったぁ~
- ・・・。私もそれが分かる境地にたどり着くことはできるのかしら?

- できるできる。「楽しい」と感じるものって、友人の刺激を受けたことが原因だったりするでしょ?プログラミングを楽しむ友達が増えていくと、そういう機会もどんどん増えていくさ。
- でも、せっかくのクリスマスなんだから、私はコーディング大会よりも、ユニバーサルスタジオに遊びに行けた方が嬉しいわ。
- ほぅ。なんでまた、USJ?
- だって、USJはこのシーズンになると、日本一大きなクリスマスツリーが飾られているらしいわよ☆ なんてロマンチック!
- へぇー。それは知らなかったなぁ。来年のために、メモメモ。。。
ローカルスコープとグローバルスコープ
- 前回はユーザー定義関数をちょろっと説明したね。
- うん。ちょろろっと説明受けました。
- 今回は、もう少し踏み込んだ説明をしていこう。まずは、「スコープ(scope)」という概念から。スコープを日本語に訳すと・・・??

- えっと。。。辞書を見ると、範囲とか領域って書いてあるわ。もう少し具体的に、「影響を及ぼす範囲」と書いてあるものもあった。
- そう。これまで詳しく説明してこなかったけど、変数にはスコープという概念があるんだ。これは簡単に言うと、変数を定義したとしても、その変数の内容を読み書きできる場所とできない場所がある、ということなんだ。
- ほぅほぅ。それとユーザー定義関数が関係するわけね。
- 鋭いね!まさにその通りで、ユーザー定義関数の外で定義した変数は、ユーザー定義関数の中では使用できないんだ。そして、その逆もしかり。
- なるほど。具体的なコードで見せてくれると嬉しいな。
- その方が手っ取り早いね。以下の例を見てみよう。
scope.php
<?php
$global_variable = "これはグローバルスコープの変数です。";
$argument = "これは引数用の変数です。";
scope_test($argument);
print("関数の外でのグローバルスコープのテスト:" . $global_variable . "<br>");
print("関数の外でのローカルスコープのテスト:" . $local_variable . "<br>");
exit();
function scope_test($local_argument) {
$local_variable = "これはローカルスコープの変数です。";
print("引数のテスト:" . $local_argument . "<br>");
print("関数の中でのグローバルスコープのテスト:" . $global_variable . "<br>");
print("関数の中でのローカルスコープのテスト:" . $local_variable . "<br>");
}
?>
- うぅ??ややこしい・・・。
- この実行結果は、スクリーンショットのようになるよ。ちょっと上のコードは読み進めづらいけど、踏ん張ってみて!
- ふーむ。結果は5行表示されているけど、それぞれ、16、17、18、8、9行目の出力結果ね!

- その通り。最初にscope_test関数の中に実行が移っているところに注意ね。
- 引数は、当然ながらちゃんと表示されているわね。ただ、コード17行目のグローバルスコープのテストは、表示されていないわ。
- うん。これが先ほど説明した、スコープの違いさ。このコードに書いているとおり、PHPでは「ローカルスコープ」と「グローバルスコープ」の2種類がある。「クラス」を使うと他にもスコープがでてくるけど、とりあえず今はここまで。
- はぁぃ。まずは、この2つをマスターすればいいのね。
- ローカルスコープは、関数の内側でしか使えないスコープだ。関数の中で定義した変数や、渡ってきた引数(ここでは$local_argument)も、ローカルスコープだよ。
- ふむ。
- そしてグローバルスコープは、関数の外側で使えるスコープだ。だから、関数内では、グローバルスコープ変数$global_variableの値を表示しようとしても、表示されない。
- なるほど。逆に、コード9行目にあるように、関数の外で$local_variableを表示しようとしても、表示されないわけね。
- うん、その通り。実はもう1つ仕掛けがあって、17行目の場合は表示させられる方法があるんだ。どう頑張っても9行目のほうは無理なんだけどね。

- ほぅ。どうやるの?
- 2通りの方法があるよ。$GLOBALS配列を使うやりかたと、global宣言を行う方法だ。
- また出た、配列。
- まず、$GLOBALS配列の使い方から説明しよう。17行目で、$global_variableの代わりに$GLOBALS["global_variable"]として実行してみてごらん。今度は、ちゃんと内容が表示されるよ。
- あ、ホントダ。
- $GLOBALSはどこのスコープでも取得できる、特殊な変数なんだ。この要素には、宣言されたグローバル変数が格納されているよ。
- 特殊な変数かぁ。。。じゃもしかして、$_POSTや$_GETも?
- 鋭い!$_POSTや$_GET、$_SESSIONなども同様で、どのスコープからでも取得できる。こういった特殊な変数のことは「スーパーグローバル変数」と呼ばれているよ。スーパーグローバル変数の種類は、マニュアルを見てみよう!
- ふむふむ。今回の授業は濃ゆいわね。さて、global宣言とはどういうもの?
- うん。global $global_variable;という行を関数内に記述することで、変数$global_variableをグローバル化させることができる。この方法のほうが、使われることが多いかな?
- まとめたら、以下のような感じになるわね。
| 変数を宣言した場所 | |||
|---|---|---|---|
| 関数の外(グローバルスコープ) | 関数の中(ローカルスコープ) | ||
| 変数を使う場所 | 関数の外(グローバルスコープ) | ◎ 何も考えずにそのまま使える | X 使用することはできない |
| 関数の中(ローカルスコープ) | ○ global宣言の後、あるいは$GLOBALSスーパーグローバル変数を使用する | ◎ 何も考えずにそのまま使える | |
- まとめてくれて、サンクス☆
- 1
- 2





ページのトップへ


GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。