今回は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変数について見ていきました。
まとめると下記になります。
・ローカル変数は関数の内部の変数、関数の外からはアクセスできず。関数の処理が終わると破棄される。
・static変数を使うと関数の変数の値を保持できる。
コメント