変数にはスコープというものがあります。
変数がどの範囲まで利用可能なのかを表すものです。
マニュアルには、このように書かれています。
変数のスコープとは、その変数が定義されたコンテキストです。
コンテキストってなんのことでしょうね。私はあまり分からず気にしたことがないです。
私の理解を書いてみたいと思います。
PHPでは変数を定義すると、どこの範囲まで有効に使用することができるのかが決まっています。
ここでいう範囲というのは、ソースコードの中での範囲です。
すごく簡単に言うと、こういうことです。
関数の中で定義した変数は、関数の中でしか使えません。 関数の外で定義した変数は、関数の外でしか使用することができます。
プログラムにして、どういうことなのかを見て理解したいと思います。
$soto = "変数の外";
echo $soto;
これは、ごく普通の使い方なので、そのまま使用できます。
次に、関数の中と外での違いを見てみます。
$soto = "変数の外";
function func() {
$naka = "変数の中";
echo $naka;
}
echo $soto;
func();
これを実行すると、このように表示されます。
変数の外
変数の中
これもそのままですよね。
では、スコープを意識して見てみたいと思います。
$soto = "変数の外";
function func() {
$naka = "変数の中";
echo $naka;
}
echo $soto;
func();
// 追加
echo $naka; // Warning: Undefined variable $naka
はい、$nakaの変数が定義されていないとワーニングになります。
変数$nakaは関数の中で定義しているものなので、関数の外からはアクセス出来ません。
ちょっと実験します。関数の中から変数を変更してみます。
$soto = "関数の外" . "\\n";
function func() {
$naka = "関数の中" . "\\n";
echo $naka;
}
echo $soto;
// 追加
$naka = "関数の外から変更" . "\\n";
func();
echo $naka . "\\n"; // どうなるでしょう?
実行するとどうなると思いますか?こちらが実行した結果です。
関数の外
関数の中
関数の外から変更
追加の部分で$naka変数を「関数の外から変更」としています。 その後にfunc関数を呼び出して、「関数の中」に変更されるわけですが、最後のechoでは、
「関数の外から変更」と表示されています。
関数の中から変更しようとしても、変更されていないことが分かります。
もう一つ実験をしてみます。
$soto = "ifの外" . "\\n";
if (true) {
$naka = "ifの中" . "\\n";
echo $naka;
echo $soto;
$naka = "ifの中から変更" . "\\n";
}
echo $naka;
echo $soto;
結果はこの通り。
ifの中
ifの外
ifの中から変更
ifの外
ifのブロックの中から変数を変更してみました。 そのまま変更できているのが分かります。
関数の中で定義された変数は、関数の外からアクセスすることは「できない」が、 ifの場合は、アクセスできるということが分かりました。
ちょっと思っていた動きと実は異なりました。
if の場合も関数と同じく、中から外。外から中の変数にはアクセスできないと思ったんですよね。
しかしアクセス出来てしまいます。
これは注意です。ifの場合は、外や中からもアクセス出来てしまいます。 でも、アクセス出来ないものと考えてプログラミングするようにしましょう。
スコープを意識するように経験を積んでいくと、変数のスコープをなるべく狭くなるように、意識してプログラミングしていくようになります。
そうしないと、この変数は、どこで定義しているんだ?と見通しの悪いソースになるからです。
ブロックの中で定義した変数は、ブロックの中でしか参照しないように作りましょう。
PHPは自由度の高いプログラミング言語です。変数も型の指定をすることなく、いつでも使用することができます。
変数のスコープも緩いですね。
自由度が高いのは良いのですが、プログラマーのレベルによって、危険なソースになってしまうということもあると思います。
PHPのグローバルスコープ
PHPは制限の緩い言語です。PHPには、globalという仕組みが存在しています。
これを使うと、どこからでも、いつでも、アクセスできる変数を作ることができます。
これは、初心者の方、ベテランの方、使わないようにしましょう。絶対におすすめしません。
勉強する必要もないと思います。これを使うくらいなら、ソースの書き方を学びglobalを使わない設計をしていくようにしてください。
まとめ
PHPの変数は、アクセスできる範囲としてスコープという仕組みがあります。
関数の外からは、外で定義した変数にアクセスすることができます。
関数の中からは、その関数の中で定義した変数にアクセスすることができます。
ifやfor / whileのブロックの場合は、中でも外でも関係なくアクセスできるが、
関数と同じく、中は中、外は外。
とスコープを狭く作ることを意識してプログラミングしていきましょう。
基礎知識を身につけて、経験あるのみ!