PHPのグローバル変数の特徴とアクセスする2つの方法

PHPのグローバル変数の扱いは他の言語に慣れていると少し特殊です。

なんで特殊かというとグローバル変数にはそのままアクセスできないようになっているから

ということでPHPでのグローバル変数にアクセスする方法について紹介していきます。

グローバル変数とは

まず初めにグローバル変数が何かについて簡単に説明

 

そもそもグローバル変数とは簡単にいえば

全てのスコープから参照できる変数

を指しています。

全てのスコープなので1つのプログラム内ならどこでも参照できるっていう意味です。

これがC言語とかJavaとか一般的な言語でのグローバル変数の定義

 

ですがPHPの場合はグローバル変数と言っても少し意味が違います。

PHPでは他の言語と違ってグローバル変数は関数やクラス内ではそのまま使えません

例えば次のようにグローバル変数  $hoge  を関数内で出力するコードがあるとしましょう。

一見すると  func();  を実行すれば  hoge  が出力されるような気がしてしまいます。

しかし実際に出力される内容は次のようなエラーメッセージ

グローバル変数なのにUndefined variable(未定義変数)扱いでエラーになってしまうのです。

 

つまりPHPでのグローバル変数というのは

関数・クラスなどグローバルでない場所ではそのままアクセスできない変数

ということになります。

 

じゃあどうすれば関数やクラス内でもアクセスすることができるのか・・・

というとPHPでは2つのアクセス方法が用意されています。

PHPでグローバル変数にアクセスする方法

その方法というのが次の2つ

  • globalキーワードを使う
  • $GLOBALS変数を使う

この2つのやり方について具体的なコード例で説明してみたいと思います。

globalキーワードを使う方法

まず1つめは global というキーワードを使って変数を参照する方法

例えば  $hoge  というグローバル変数を関数内で使うなら

と書けば関数やクラス内でも使用可能です。

 

 

より具体的なコード例を出すなら次の通り

これは先ほどの  $hoge  を出力するコードを修正したもの

先ほどだとエラーが出てしまいましたが、  global  を使えば期待通りに  hoge  と出力されます。

 

ちなみに global にはコンマ区切りで複数のグローバル変数が指定可能です。

例えば次がそのコード例

global $hoge, $fuga  みたいにコンマ区切りで区切ればOKです。

 

以上が globalキーワードでグローバル変数を参照する方法

多分グローバル変数の参照にはこれを使うのがほとんどだと思います。

$GLOBALS変数を使う方法

お次は $GLOBALS というスーパーグローバル変数を使う方法

「スーパーグローバルって何?」という話ですがPHPマニュアルでは次のように説明されてます。

PHP の定義済み変数の中には "スーパーグローバル" というものがあります。 これは、スクリプト全体を通してすべてのスコープで使用可能な変数のことです。 関数やメソッドの内部からアクセスする際にも global $variable; などとする必要はありません。

PHP : スーパーグローバル - Manual

上の説明のように関数でもクラス関数でも globalキーワードなしでアクセスできる変数のことです。

どこからでもアクセスできるという意味ではこちらの方が他の言語でいうところのグローバル変数に近いと言えるかもしれません。

ただしスーパーグローバルはPHPで定義されたものしか使えず、自分では定義できないようです。

 

それで $GLOBALS を使えば普通のグローバル変数にアクセスできます。

例えば  $hoge  というグローバル変数にアクセスしたいなら次のように書けばOK

$GLOBALS は連想配列形式なので  $  を含まない変数名を渡せばその値を参照できます。

 

具体的なコード例を出すなら次の通り

globalキーワードを使った場合と同様、こちらも期待通りに  hoge  と出力されます。

 

また $GLOBALS でグローバル変数を書き換えるには直接代入すればOKです。

例えば次は  $hoge  の値を書き換えているコード例

上のコードでは  $hoge  の値を  'hoge'  から  'piyo'  に書き換えています。

 

以上が $GLOBALS を使ったグローバル変数の参照方法

こちらはあまり見かけませんが、こういう書き方もあるよという参考で紹介しました。

グローバル変数に普通にアクセスできないのはなぜ?

以上がPHPでのグローバル変数のアクセス方法です。

ただ不思議なのはなんでPHPだけわざわざ回りくどい書き方をしなきゃいけないかということ

これは重要なグローバル変数を上書きしないようにするためです。

 

例えばC言語の場合グローバル変数は好きなように書き換えできてしまいます。

以下がそのコード例

C言語を知らない人には少し分かりにくいと思いますが、  max  というグローバル変数をメイン関数内で置き換えています。

 

上のようにグローバル変数が簡単に書き変え出来てしまうと

  • システム的に重要な変数の値が勝手に変更される
  • ライブラリなどで読み込んだ変数が書き換えられる

などのハプニングが意図せずに起きてしまうかもしれません。

そういうリスクをなくすためにPHPでは回りくどい書き方を採用しているわけです。

まあそもそもグローバル変数はPHPに限らず使わない方がいい気もしますけどね

ここまでのまとめ

ということでここまでのまとめ

  • グローバル変数って何?
    全てのスコープからアクセスできる変数のこと
    ただしPHPの場合は関数やクラス内では普通にアクセスできない
  • グローバル変数にアクセスするには

    方法1 : globalキーワードを使う

    方法2 : $GLOBALS変数を使う

ということでPHPでのグローバル変数についてまとめてみました。

個人的には $GLOBALS より global を使った書き方が圧倒的に多いと感じます。

ではでは($・・)/~~~