PHPの変数のスコープについてサンプルコード付き解説!
PHPの変数のスコープについてサンプルコード付きで解説します。グローバルスコープやローカルスコープについての解説とglobalキーワードの使い方まで初心者向けにご紹介します。
PHPの変数のスコープとは?
PHPでは変数を定義することで、数値や文字列などの値を一時的に格納することが出来ます。
一方でこの定義した変数は「どこでも利用できるか?」というとそうではありません。
実際には変数には有効範囲(スコープという)が決まっており、その有効範囲の中でしか使うことは出来ません。
今回はこのPHPのスコープについてサンプルコード付きで解説します。
グローバルスコープとローカルスコープ
PHPではグローバルスコープとローカルスコープの2種類のスコープがあります。それぞれ紹介していきます。
グローバルスコープ
グローバルスコープは、PHPのプログラム全体から参照できる有効範囲の事です。
グローバルスコープの中で定義された変数をグローバル変数と言います。
ローカルスコープ
一方でローカルスコープは、基本的には{}で囲まれた関数やクラスのメソッド内の有効範囲の事です。
このローカルスコープの中で定義された変数をローカル変数と言います。
ちなみにローカルスコープ内部で定義された変数には、その外側からはアクセスできません。
具体例
文章だけだと分かりづらいので1つサンプルコードで見てみましょう。
上記のサンプルコードでは$name
という変数がmy_pet()
という自作関数の外側と内側の両方で登場しています。
最後出力する際には、それぞれの変数の中身が出力されています。
ここで上記のプログラムでスコープを表すと下記のようになります。
順番に見ていきましょう。
ポチ
まずグローバルスコープで$name = "ポチ";
の変数が定義されています。この変数はグローバルスコープで定義されているので、グローバル変数です。
コロ
次に関数内部のローカルスコープで$name = "コロ";
が定義されています。ローカルスコープで定義されているので、ローカル変数です。
つまりポチとコロの値の変数はスコープが異なるので、別扱いのため、名前が同じでも問題ありません。
echo
echo
文の箇所では、まず関数my_pet()
が呼び出されています。
my_pet()
ではローカル変数をecho
していますので、「コロ」が出力されます。
最後のecho
はグローバルスコープで実行されていますので、グローバル変数の「ポチ」が出力されます。
【非推奨】グローバル宣言
これは非推奨の方法ですが、一応ご紹介しておきます。
先程の例ではスコープが異なるため$name
という同じ変数名でも問題ありませんでした。
一方でローカルスコープの中でグローバル変数を参照する方法があります。
下記のサンプルコードを見てみましょう。
上記の例では関数の中でglobal $name;
という記述があります。global
というキーワードをつけて、変数名を指定することで、グローバル変数を参照することが出来ます。
(ちなみに別ファイルのグローバル変数もglobal
キーワードで使うことが出来ます)
これを便利ととるか、危険ととるかはエンジニア次第ですが、非常に大きな問題です。
例えばglobal
キーワードの後で$name = "コロ";
と、変数の中身を上書きしていますので、グローバル変数が上書きされます。
その結果、echo
では両方とも「コロ」と出力されます。
このようにglobal
キーワードを付けると、関数の中であろうと外であろうと変数を参照できますが、一方でどこで変数が上書きされるか把握することは出来ません。
そのため、変数の中身が分からず思わぬ不具合につながる可能性があります。極力global
キーワードは使わないほうが無難です。