【PHP入門】変数のスコープとstatic変数について

PHP

今回はPHPの変数のスコープとstatic変数について、解説しています。
変数のスコープは、変数を使える有効な範囲のことです。

スコープを意識しておかないと、変数に思ってなかった値が入ったりしてバグの原因になります。
実際にコードをみて確認しましょう。

変数のグローバルスコープについて

関数の外側で宣言した変数がグローバル変数です。

グローバル変数には、どこからでもアクセスできる変数です。
ですが、下記のように関数からアクセスしようとした場合はアクセスできません。

<?php

$globalNumber = 10; 

function showGlobalNumber() {
    $globalNumber = 0;
    $globalNumber += $globalNumber + 1;
}

showGlobalNumber();
echo $globalNumber;

最初に$globalNumberに10を入れています。
そして、showGlobalNumber関数を呼び出して、$globalNumberに0を入れてた後に、+1して、$globalNumberを更新しています。
最後にechoで出力して、処理終了です。

なんとなく1が出力されるのかな..と初見の場合は思うかもしれませんが、これは10になります。
関数の内部からグローバル変数にアクセスする場合は、globalというキーワードを使わないといけないからです。

上記のプログラムを書き直して関数内部からアクセスさせると、こうなります。

<?php

$globalNumber = 10; 

function showGlobalNumber() {
    global $globalNumber;                                                                                                                                    
    $globalNumber = 0;
    $globalNumber += $globalNumber + 1;
}

showGlobalNumber();
echo $globalNumber;

書き直した上記のコードでは、最初に関数内部でglobalキーワードを使ってグローバル変数を使うことを宣言しています。
こうすると、グローバルな変数($globalNumber)の値は書き換わって、出力結果は1になります。

変数のローカルスコープについて

関数の外側がグローバルでしたね。

ローカルスコープは関数の内部で宣言した変数のスコープです。
関数の内部で宣言した変数は、その内部でだけ有効です。

<?php

function showLocalNumber() {
        $localNumber = 999;
    echo "localNumberは{$localNumber}\n";
}

showLocalNumber();
echo "localNumberは{$localNumber}\n";

上記の結果は下記のようになります。(※警告などは無視しています)

localNumberは999
localNumberは

1回目は関数を呼んで、その中身を出力しているので999が出ています。
2回目は関数の外でechoしていますが、ローカル変数なのでアクセスできずに空になった…といった感じです。

ローカルスコープの変数(関数内部の変数)は関数を呼び終わると破棄されます。

<?php
function counter() {
    $count++;
    echo "{$count}\n";
}

counter();
counter();
counter();

これは3回counter関数を呼んでます。
結果は3回1が出力されます。

1
1
1

static変数について

staticな変数はstaticキーワードを付けることで宣言できます。
static変数は関数内で使います。関数を呼び終えても変数の内容が破棄されないようになります。

先ほどのプログラムを書き換えます。

<?php
function counter() {
    static $count;
    $count++;
    echo "{$count}\n";
}

counter();
counter();
counter();

このようにstaticを付けることで$countの値が保持されます。
結果出力が下記のようになります。

1
2
3

終わりに

今回は変数のスコープ(グローバル変数・ローカル変数)とstatic変数について見ていきました。

まとめると下記になります。

・グローバル変数は関数の外部の変数、関数からアクセスするには`global`を使う。
・ローカル変数は関数の内部の変数、関数の外からはアクセスできず。関数の処理が終わると破棄される。
・static変数を使うと関数の変数の値を保持できる。

コメント

タイトルとURLをコピーしました