PHPのグローバル変数の扱いは他の言語に慣れていると少し特殊です。
なんで特殊かというとグローバル変数にはそのままアクセスできないようになっているから
ということでPHPでのグローバル変数にアクセスする方法について紹介していきます。
このページの目次
グローバル変数とは
まず初めにグローバル変数が何かについて簡単に説明
そもそもグローバル変数とは簡単にいえば
「全てのスコープから参照できる変数」
を指しています。
全てのスコープなので1つのプログラム内ならどこでも参照できるっていう意味です。
これがC言語とかJavaとか一般的な言語でのグローバル変数の定義
ですがPHPの場合はグローバル変数と言っても少し意味が違います。
PHPでは他の言語と違ってグローバル変数は関数やクラス内ではそのまま使えません。
例えば次のようにグローバル変数 $hoge を関数内で出力するコードがあるとしましょう。
1 2 3 4 5 6 |
$hoge = 'hoge'; function func(){ echo $hoge; } func(); |
一見すると func(); を実行すれば hoge が出力されるような気がしてしまいます。
しかし実際に出力される内容は次のようなエラーメッセージ
1 |
PHP Notice: Undefined variable: hoge |
グローバル変数なのにUndefined variable(未定義変数)扱いでエラーになってしまうのです。
つまりPHPでのグローバル変数というのは
「関数・クラスなどグローバルでない場所ではそのままアクセスできない変数」
ということになります。
じゃあどうすれば関数やクラス内でもアクセスすることができるのか・・・
というとPHPでは2つのアクセス方法が用意されています。
PHPでグローバル変数にアクセスする方法
その方法というのが次の2つ
- globalキーワードを使う
- $GLOBALS変数を使う
この2つのやり方について具体的なコード例で説明してみたいと思います。
globalキーワードを使う方法
まず1つめは global というキーワードを使って変数を参照する方法
例えば $hoge というグローバル変数を関数内で使うなら
1 |
global $hoge; |
と書けば関数やクラス内でも使用可能です。
より具体的なコード例を出すなら次の通り
1 2 3 4 5 6 7 8 9 10 |
$hoge = 'hoge'; function func(){ /** グローバル変数を参照 */ global $hoge; echo $hoge; /// => hoge } func(); |
これは先ほどの $hoge を出力するコードを修正したもの
先ほどだとエラーが出てしまいましたが、 global を使えば期待通りに hoge と出力されます。
ちなみに global にはコンマ区切りで複数のグローバル変数が指定可能です。
例えば次がそのコード例
1 2 3 4 5 6 7 8 9 10 11 12 |
$hoge = 'hoge'; $fuga = 'fuga'; function func(){ /** 複数のグローバル変数を指定 */ global $hoge, $fuga; echo $hoge; /// => hoge echo $fuga; /// => piyo } func(); |
global $hoge, $fuga みたいにコンマ区切りで区切ればOKです。
以上が globalキーワードでグローバル変数を参照する方法
多分グローバル変数の参照にはこれを使うのがほとんどだと思います。
$GLOBALS変数を使う方法
お次は $GLOBALS というスーパーグローバル変数を使う方法
「スーパーグローバルって何?」という話ですがPHPマニュアルでは次のように説明されてます。
PHP の定義済み変数の中には "スーパーグローバル" というものがあります。 これは、スクリプト全体を通してすべてのスコープで使用可能な変数のことです。 関数やメソッドの内部からアクセスする際にも global $variable; などとする必要はありません。
上の説明のように関数でもクラス関数でも globalキーワードなしでアクセスできる変数のことです。
どこからでもアクセスできるという意味ではこちらの方が他の言語でいうところのグローバル変数に近いと言えるかもしれません。
ただしスーパーグローバルはPHPで定義されたものしか使えず、自分では定義できないようです。
それで $GLOBALS を使えば普通のグローバル変数にアクセスできます。
例えば $hoge というグローバル変数にアクセスしたいなら次のように書けばOK
1 |
$GLOBALS['hoge']; |
$GLOBALS は連想配列形式なので $ を含まない変数名を渡せばその値を参照できます。
具体的なコード例を出すなら次の通り
1 2 3 4 5 6 |
$hoge = 'hoge'; function func(){ echo $GLOBALS['hoge']; /// => hoge } func(); |
globalキーワードを使った場合と同様、こちらも期待通りに hoge と出力されます。
また $GLOBALS でグローバル変数を書き換えるには直接代入すればOKです。
例えば次は $hoge の値を書き換えているコード例
1 2 3 4 5 6 7 8 |
$hoge = 'hoge'; function func(){ $GLOBALS['hoge'] = 'piyo'; } func(); echo $hoge; /// => piyo |
上のコードでは $hoge の値を 'hoge' から 'piyo' に書き換えています。
以上が $GLOBALS を使ったグローバル変数の参照方法
こちらはあまり見かけませんが、こういう書き方もあるよという参考で紹介しました。
グローバル変数に普通にアクセスできないのはなぜ?
以上がPHPでのグローバル変数のアクセス方法です。
ただ不思議なのはなんでPHPだけわざわざ回りくどい書き方をしなきゃいけないかということ
これは重要なグローバル変数を上書きしないようにするためです。
例えばC言語の場合グローバル変数は好きなように書き換えできてしまいます。
以下がそのコード例
1 2 3 4 5 6 7 8 9 |
int max = 1000; int main(){ max = 9999; printf("max = %d", max); /// => 9999 return; } |
C言語を知らない人には少し分かりにくいと思いますが、 max というグローバル変数をメイン関数内で置き換えています。
上のようにグローバル変数が簡単に書き変え出来てしまうと
- システム的に重要な変数の値が勝手に変更される
- ライブラリなどで読み込んだ変数が書き換えられる
などのハプニングが意図せずに起きてしまうかもしれません。
そういうリスクをなくすためにPHPでは回りくどい書き方を採用しているわけです。
まあそもそもグローバル変数はPHPに限らず使わない方がいい気もしますけどね
ここまでのまとめ
ということでここまでのまとめ
- グローバル変数って何?
全てのスコープからアクセスできる変数のこと
ただしPHPの場合は関数やクラス内では普通にアクセスできない - グローバル変数にアクセスするには
方法1 : globalキーワードを使う
1global $hoge;方法2 : $GLOBALS変数を使う
1$GLOBALS['hoge'];
ということでPHPでのグローバル変数についてまとめてみました。
個人的には $GLOBALS より global を使った書き方が圧倒的に多いと感じます。
ではでは($・・)/~~~