【PHP】グローバルスコープ、ローカルスコープ、スーパーグローバルについて
関数を使う上でスコープの理解は必須となります。
PHPのグローバルスコープ、ローカルスコープ、スーパーグローバルについて紹介します。
スコープとは
スコープとは、変数が参照可能な範囲のことをいいます。
次の3つのスコープがあります。
- グローバルスコープ
- ローカルスコープ
- スーパーグローバル
以下に例を出しながら説明します。
<?php
// グローバルスコープ
$globalVal = 10;
function func() {
// ローカルスコープ
$localVal = 20;
}
function func2() {
// ローカルスコープ
$localVal = 0;
print_r($localVal); //これはできない
}
func2();
上のようにファイルに記述されていて、{}に囲まれていない変数は、グローバルスコープの変数となります。
関数の中で宣言されている変数は、ローカルスコープとなります。
ローカルスコープの注意点
大事な点としては、ローカルスコープで宣言された変数は、ローカルスコープ内でのみ有効となります。
つまり、func()の中の変数は、func()のローカルスコープ外であるfunc2()の中では、使えないということです。
Noticeで「Undefined variable」というエラーが出ている場合、このローカルスコープ外に変数がないかを確認する必要があります。
ローカルスコープのメリット
ローカルスコープのメリットは、使える範囲が制限されることで、思わぬバグの混入を防ぐことができます。
グローバルスコープで変数を宣言しすぎると、意図せず変数がかぶってしまって思わぬバグを生むことがあります。
ローカルスコープを使うことで、意図的に使いたいところでのみ変数を有効にすることができます。
また、関数ごとに同じ変数名であっても使用できるようになります。
関数内でグローバルスコープの変数を使いたいとき
<?php
// グローバルスコープ
$globalVal = 10;
function func3() {
// ローカルスコープ
$localVal = 20;
global $globalVal;
echo $globalVal;
}
func3();
上のように、グローバルスコープで宣言された変数を関数内のローカルスコープで使うときは、globalキーワードを使います。
globalと記述して、その変数名を書きます。
そうすることで、ローカルスコープ内でも使えるようになります。
スーパーグローバルについて
<?php
function func4() {
// ローカルスコープ
var_dump($_SERVER);
}
func4();
スーパーグローバルの変数は、globalキーワードが必要のない変数のことを言います。
たとえば、$_SERVERといったものがあります。
スーパーグローバルの場合は、関数内で直接使うことができます。
if文ではローカルスコープは形成されない
プログラミング言語の中には{}などでローカルスコープが形成されるものもありますが、PHPでは、if文ではローカルスコープは形成されません。