変数のスコープ
変数の有効範囲
「変数の有効範囲」にはユーザ定義関数が大いに絡んできます。ユーザ定義関数が分からない場合は読み飛ばしてしまっても問題ないか・・・というとそうでもありませんので、ユーザ定義関数について簡単に解説しておきます。
ユーザ定義関数とはユーザ、つまり、PHPスクリプトを書いている人が定義できる関数です。今のところ、「自分で作れる関数」と思ってもらってもいいと思いますが、そもそも関数が何か分からない人もたくさんいると思います。関数がどういうものかの詳細解説はユーザ定義関数で行いますが、簡単に解説しておくと、よく使う機能を予め定めておいたスクリプト、というように今のところは理解しておいてもらいましょう。
さて前置きが長くなってしまいましたが、変数にはスコープと呼ばれる有効範囲が存在します。有効範囲と言っても現在のところ、関数さえ作成しなければ何の問題ありません。
まず、変数を関数外で作成した変数と、関数内(関数の定義部)で作成した変数に分けます。
関数外で作成した変数はグローバルスコープと呼ばれ、今までのスクリプトでもいつでも参照(出力したり値を取り出したりして呼び出す事)できていたと思います。
問題なのは関数内で作成した変数です。これはローカルスコープと呼ばれ、その関数内でしか参照できません。また関数内で変数を参照した場合、PHPはデフォルトでローカルスコープの(同じ関数の中にある)変数を探しますので、関数外で定義したグローバルスコープの変数を参照できません。
1回読んだだけでは意味が分からないかもしれませんが、関数を定義する時に使った変数は、普通に呼び出したりとかできない、普通に定義した変数は関数を定義する時に呼び出したりできない、って事です。
なんとなく分かったような分からないような・・・ってところでしょうが、サンプルです(笑)
変数のスコープサンプル
- $a = "スコープのテスト"; // 関数外での変数定義(グローバルスコープ)
- function test_scope1(){
- echo $a; // 変数の参照(ローカルスコープの変数を探してしまう)
- }
- test_scope1(); // 関数を参照してみる
さて上記のサンプルですが、「スコープのテスト」と出力されるのを期待してしまいますが、実は何も出力されません。
これは変数の参照が関数の内部で行われているからです。さきほどグローバルスコープとローカルスコープの変数についてはお話したと思いますが、このスクリプトでecho()が探しているのはローカルスコープの変数、つまり関数の内部で定義された変数のみです。それに対して変数「$a」は関数外で値を代入していますので、変数「$a」の定義は関数外、つまりグローバルスコープになります。
つまり「有効範囲が違ったために変数を参照できなくなっている」という事がお分かり頂けると思います。
これはローカルスコープ(関数内)で作成した変数をグローバルスコープ(関数外)で使おうとした場合も同じです。上記のサンプルと反対の定義・参照方法ですね。お試しになりたければ以下のスクリプトをどうぞ。
- function test_scope2(){
- $b = "ローカルスコープの変数"; // 関数内での変数定義(ローカルスコープ)
- };
- test_scope2(); // 関数の参照により変数$bが定義されたはずだが・・・・
- echo $b; // 変数の参照(グローバルスコープの変数を探してしまう)





