はじめに
前回の記事では、PHPの可変長引数について紹介しました。
前回の記事
本記事では、変数のスコープ(ローカル変数、グローバル変数)について紹介します。
変数のスコープとは
変数のスコープとは、定義した変数が使える範囲のことをいいます。
ローカル変数とは
ローカル変数とは、関数内で定義した変数のことです。
ローカル変数のスコープは変数を宣言した関数内です。そのため、ローカル変数を定義した関数内でしか使用できません。(ローカル変数を関数の外で使用するとエラーが発生する)
[ローカル変数の使用例]
<?php
function test() {
$a = 1;
print "ローカル変数aの値:$a";
}
test();
?>
[実行結果]
ローカル変数aの値:1
グローバル変数とは
グローバル変数とは、関数の外で定義した変数や、関数内でglobalをつけて定義した変数のことです。
スポンサーリンク
グローバル変数のスコープはPHPスクリプト全体です。関数内でしか使えないローカル変数とは違い、グローバル変数は関数内外に関わらず使用できます。
グローバル変数を関数内で使用するときは「global」の宣言を行います。
[global宣言なしの場合]
<?php
$a = 0;
function test() {
$a = 0;
$a++;
print "関数内の変数aの値:$a <br />";
}
test();
print "関数外の変数aの値:$a";
?>
[実行結果]
関数内の変数aの値:1
関数外の変数aの値:0
関数外で定義した「$a」と関数内で定義した「$a」は同じ変数名だが、関数外で定義した「$a」はグローバル変数、関数内で定義した「$a」はローカル変数と判断されてしまいます。(別の変数として扱われる)
そのため、関数内でグローバル変数を使用するときは「global」の宣言(グローバル変数として扱う)が必要です。
以下は、global宣言ありの場合の例です。
[global宣言ありの場合]
<?php
$a = 0;
function test() {
global $a;
$a++;
print '[関数内]グローバル変数aの値:'.$GLOBALS["a"].'<br />';
}
test();
print "[関数外]グローバル変数aの値:$a";
?>
[実行結果]
[関数内]グローバル変数aの値:1
[関数外]グローバル変数aの値:1
global宣言をすることで、関数外で定義したグローバル変数を関数内で参照できました。
スーパーグローバル変数「$GLOBALS」
グローバル変数は、スーパーグローバル変数の「$GLOBALS」を使って表現することもできます。
[$GLOBALSの例]
<?php
$a = 0;
function test() {
$GLOBALS['a']++;
print "[関数内]グローバル変数aの値:".$GLOBALS['a']."<br />";
}
test();
print "[関数外]グローバル変数aの値:$a";
?>
[実行結果]
[関数内]グローバル変数aの値:1
[関数外]グローバル変数aの値:1
静的(static)変数とは
ローカル変数にstaticをつけると、静的(static)変数に変わります。ローカル変数と静的変数の違いは、関数の呼び出しごとに値が残るかどうかです。
静的変数の初期化は最初の1回のみおこなわれ、関数の処理が終わってもその値を失いません。
次の例は、ローカル変数と静的変数の例です。
[ローカル変数と静的変数の例]
<?php
function test() {
$a = 0;
static $b = 0;
$a++; $b++;
print "ローカル変数aの値=$a 静的変数bの値=$b <br />";
}
test();
test();
?>
[実行結果]
ローカル変数aの値=1 静的変数bの値=1
ローカル変数aの値=1 静的変数bの値=2
ローカル変数は、関数の処理が終わったらその値を失います。そのため「test()」をコールするたびにローカル変数「$a」が作られます。(実行結果のとおり、常に値は1になる)
それに比べ 静的変数は、関数の処理が終わってもその値を失いません。そのため「test()」を初回にコールしたときに静的変数「$b」の初期化が行われ、2回目以降「test()」をコールしたときは、初期化処理は行われず既に作成されている静的変数「$b」を使用します。(実行結果のとおり、値は増えていく)
終わりに
本記事では、変数のスコープ(ローカル変数、グローバル変数、静的変数)について紹介しました。
次回の記事では、PHPのクラスについて紹介します。