第16回 変数のスコープとデータ型 - PHP基礎講座

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

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)