PHPにはグローバルな場所でないと普通にはアクセスできないグローバル変数があります。
そのグローバル変数に対して、関数でもクラスでもglobalでの定義なしでアクセスできるのがglobalsです。
今回はスーパーグローバル変数の1つであるglobalsについてご紹介いたします。
目次
globalsはグローバルスコープで使用可能な全ての変数への参照を含む配列
PHPのプログラム内で関数やクラス外で定義された変数を、グローバル変数と呼びます。
【PHP】グローバル変数(global)とは?ローカル変数との使い分け方同じグローバルスコープ内で使用可能な全てのグローバル変数への参照を含んだ配列が、globalsです。
以下のコードのようにグローバル変数をglobalsの配列として呼び出すことができます。
1 2 3 4 5 |
$str = 'グローバルな変数'; echo $str." \n"; echo $GLOBALS['str']." \n"; |
グローバル変数として定義した変数「str」を直接呼び出したものと、globalsで呼び出したもので、実行すると以下のように表示されます。
グローバルな変数
グローバル変数であればglobalsで呼び出して同じように扱うことが可能です。
グローバルスコープ内で更にクラスや関数内部で定義するローカル変数は参照できないので注意です。
globals自体php内で定義済みのスーパーグローバル変数
globalsはphpで元から定義されているスーパーグローバル変数の1つです。データ型は配列なので、配列としてしか使用できません。
その代わり同一のグローバルスコープ内にあるグローバル変数であれば、どこでも参照できます。
globalsは自動グローバル変数とも呼ばれています。
スーパーグローバル変数はglobals以外にも複数ある
スーパーグローバル変数にはglobals以外にもいくつかあります。
phpのスーパーグローバル変数を以下に表でまとめました。
変数名 | 機能 |
---|---|
$GLOBALS | グローバルスコープ内で使える全てのグローバル変数への参照 |
$ SERVER | サーバの情報・実行時の環境情報 |
$ GET | HTTP GET 変数 |
$ POST | HTTP POST 変数 |
$ FILES | HTTPファイルアップロード変数 |
$ REQUEST | HTTPリクエスト変数 |
$ SESSION | セッション変数 |
$ ENV | 環境変数 |
$ COOKIE | HTTPクッキー |
上記のものはphpのプログラムコード内からならば、どこからでも使用が可能です。
通常の変数は有効範囲などにルールがありますが、スーパーグローバル変数はこれらを無視できてしまいます。その分特化した機能しか持っていないため、上記のように数種類存在しています。
【初心者向け】$_FILESで画像をアップロードする方法globalsはコード中どこからでも使用することができる
先程から何回も記載していますがglobalsはコード中であればどこでも使用できます。
通常グローバル変数を関数・クラス内部で使う場合、スコープ内で「global」で定義する必要があります。
globalキーワードで定義する必要があるのですが、globalsを使えばこの定義が必要ないのです。
例えば以下のようなコードでエラーが一切出ずに処理が行えます。
1 2 3 4 5 6 7 8 |
$str = 'グローバルな変数'; function GlobalStr(){ echo $GLOBALS['$str']." \n"; } GlobalStr(); |
GlobalStr()内でstrを参照するためにglobalで定義する必要がなく、$GLOBALSの配列内で直接strに参照しています。
実行すると以下のように表示されます。
定義されていないなどのエラーなど出ずにちゃんと処理が実行されます。
globalsはphpのコード内全体で使えるスーパーグローバル変数として定義されているので、$GLOBALSをglobalで定義する必要もないです。
globalsは関数内部での値保持や参照元のグローバル変数変更が可能
globalsでは関数内部で値保持や参照元となるグローバル変数の変更もできます。
例えば以下のようにグローバル変数で定義した数値に加算処理を加えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$int = 5; function Multiply(){ $GLOBALS['int'] * 2; } Multiply(); Multiply(); Multiply(); echo "$int "; echo $GLOBALS['int']; |
実行結果は以下のように表示されます。
40
グローバル変数で定義したintに2の乗算を行う処理です。
3回処理を実行しており、関数内部での値保持&参照元変数変更の両方が行われているため、1回目は5×2、2回目は10×2、3回目は20×2と処理されています。
このようにglobalsは関数やクラスで処理をして外部に出てもリセットされず、値を維持すると共に元のグローバル変数の上書きも同時にしてくれます。
グローバル変数に普通にアクセスできないのは上書きされないようにするため
グローバル変数へのアクセス方法は今回紹介したglobalsを使うか、globalキーワードで定義するかの2種類しかないです。
グローバルな場所以外は2種類の限定的な方法でない限りはアクセスできないようになっています。
なぜこのような回りくどい方法になっているのかと言うと、グローバル変数の変更・上書きを簡単にされないためです。
phpで勝手にグローバル変数の書き換えが起こってしまうと、以下のような問題が起こる可能性があります。
- ・システム上重要な変数の値が勝手に書き換えられてしまう
- ・ライブラリなどで読み込んだ大事な変数が書き換わってしまう
- etc…
一歩間違えると処理が停止してしまうようなフェータルエラーを起こす可能性まであります。
こういったリスク回避のためにグローバル変数はわざと回りくどい方法をとっています。
【初心者向け】PHPのエラーを確認する方法!どのような型のグローバル変数でもglobalsでアクセス可能
グローバル変数に限らずですが、変数を定義する際strのような文字列やintのような整数など様々な型があります。
他にも少数の型であるfloatや配列の型となるarrayなども存在しています。参照元のグローバル変数がどのような型で作られていたとしても、globalsからはアクセスすることができます。
globals自体が配列型でできたものですが、その中に配列型arrayで作られたグローバル変数を入れてもちゃんと参照してくれます。
配列の中に配列で少し複雑に見えますが、なんの問題もなく実行することができます。配列の場合のみ書き方が少し違っていて、以下のように[]を2つ使います。
1 2 3 4 |
$array = array('name' => 'no-name'); echo $GLOBALS['array']['name']." \n"; |
1つ目の[]に配列名で2つ目の[]に変数名を入れる必要があります。
こうしないとどの配列を指しているかがわからずエラーになるので注意してくださいね。
まとめ
今回はphp内で定義済みの変数であるスーパーグローバル変数の1つglobalsを紹介しました。
globalsはglobalを使って変数を定義していなくても関数内などで変数を使用できるなど便利な変数配列です。
その他にも色々と便利な機能を持っていますので、必要ならば積極的に使っていきましょうね。