PHP入門

【PHP入門】変数のスコープ(ローカル変数、グローバル変数)

2021年6月30日

はじめに

前回の記事では、PHPの可変長引数について紹介しました。

本記事では、変数のスコープ(ローカル変数、グローバル変数)について紹介します。

変数のスコープとは

変数のスコープとは、定義した変数が使える範囲のことをいいます。

ローカル変数とは

ローカル変数とは、関数内で定義した変数のことです。

ローカル変数のスコープは変数を宣言した関数内です。そのため、ローカル変数を定義した関数内でしか使用できません。(ローカル変数を関数の外で使用するとエラーが発生する)

ローカル変数のスコープ

[ローカル変数の使用例]

<?php

function test() {
    $a = 1;
    print "ローカル変数aの値:$a";
}

test();

?>

[実行結果]

ローカル変数aの値:1

グローバル変数とは

グローバル変数とは、関数の外で定義した変数や、関数内でglobalをつけて定義した変数のことです。

スポンサーリンク

グローバル変数のスコープはPHPスクリプト全体です。関数内でしか使えないローカル変数とは違い、グローバル変数は関数内外に関わらず使用できます。

グローバル変数のスコープ

グローバル変数を関数内で使用するときは「global」の宣言を行います。

なぜ「global」の宣言が必要なんですか?
「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宣言をすることで、関数外で定義したグローバル変数を関数内で参照できました。

関数内では「global宣言あり:グローバル変数」「global宣言なし:ローカル変数」として扱います。

スーパーグローバル変数「$GLOBALS」

グローバル変数は、スーパーグローバル変数の「$GLOBALS」を使って表現することもできます。

書き方が違うだけで、globalと同じ意味です。

[$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」を使用します。(実行結果のとおり、値は増えていく)

ローカル変数は、関数をコールするたびに新しく作られ(関数の処理が終わると失う)、静的変数は1度作られたらその値は残り続ける変数です。

終わりに

本記事では、変数のスコープ(ローカル変数、グローバル変数、静的変数)について紹介しました。

次回の記事では、PHPのクラスについて紹介します。

helpful