スコープ違いの変数
global宣言で変数参照
「変数には有効範囲(スコープ)があって、有効範囲が違うと変数が参照できなくなる」という事まではお分かり頂けたとして、次はこれを回避する為にスコープが違っても変数が参照できるようにしたいと思います。方法は2つあります。
まず「global」というキーワードですが、このキーワードを変数の前につけて宣言する事によってスコープの違う変数でも参照できるようになります。
global宣言サンプル
- $c = "グローバル変数";
- function test_scope3(){
- global $c; //スコープ違いの変数を参照したいのでglobal宣言
- echo $c;
- };
- test_scope3();
出力結果
global宣言によってグローバル(関数外)変数をローカルスコープ(関数内)でも参照できるようになります。このサンプルでは記述していませんが、もちろんtest_scope3();実行後に$cを呼び出す事も可能です。つまり、global宣言で「どちらのスコープでも使用可能」な変数が作成できる事になります。
複数の変数にglobal宣言をしたい場合はカンマ「,」で区切って複数指定ができます。
複数のglobal宣言
- global $a, $b, $c, $d;
$GLOBALSで変数参照
2つ目の方法ですが、$GLOBALSという連想配列を使います。連想配列なのでもちろんキー(添え字)が必要ですが、その前に$GLOBALSという配列の説明をしたいと思います。
$GLOBALSはPHPにあらかじめ定められている定義済み変数(配列も変数の一種です)の1つで、グローバルスコープ(関数外)の変数のうち、現在のPHPスクリプト上で使用可能な全ての変数を参照する事ができます。参照の仕方は
$GLOBALS変数サンプル
- $GLOBALS["変数名"];
とするだけです。さらに、$GLOBALSはPHPによってあらかじめ定められている変数なだけあって随分特殊です。何が特殊かというとスーパーグローバルと呼ばれ、最初からスコープ(有効範囲)無視!!という大変重宝する働きをしてくれているのです。正確には「スコープ無視」ではなく「どちらのスコープにも存在する」という働きなのですが、細かい違いはこの際いいです(笑)。このスーパーグローバルという働きのおかげで、$GLOBALSを使用する際にはいちいちglobal宣言する必要はありません。
余談になりますが、スーパーグローバル変数は$GLOBALSだけじゃありません。フォーム処理などで必要になってくる$_POSTや$_GETもスーパーグローバルです。スーパーグローバル変数に関連する事だけで丸1枚、しかもかなり長いファイルを作れてしまうほどなので今はこのくらいにしておきますが、スコープに左右されない変数がいくつかある、という程度は覚えておいて下さい。
さて、ちょっと話がそれてしまいましたが、$GLOBALSを使った場合のサンプルはこちらです。
サンプルスクリプト
- $d = 1;
- $e = 2;
- function test_scope4(){
- $GLOBALS["e"] = $GLOBALS["d"] + $GLOBALS["e"];
- }
- test_scope4();
- echo $e;
出力結果
グローバルスコープの$eをローカルスコープ内で$GLOBALS["e"]として値を変更をしましたが、関数外で再度参照しても関数内での変更がちゃんと反映されています。