PHPのスコープ
更新日 : 2019年03月13日
プログラミングにおいて、変数のスコープは重要です。変数の値をどこまで気にすればよいのか、宣言し代入した変数がどのあたりまで使えるのかを把握しやすくすることで、コードの品質も保たれます。
変数のスコープに関しては、プログラミングカテゴリーの記事でも説明しましたが、PHPの変数スコープは少しややこしいため、別記事としてPHPのスコープについて学んでいきます。
中括弧のスコープではない
変数のスコープ記事では、変数のスコープは基本的には中括弧{}で考えると説明しました。中括弧で囲う全体をプログラミングではブロックと呼びますが、PHPにはブロックのスコープはありません。
下記のコードを見てみましょう。
<?php
$val1 = 1;
if(true) {
$val2 = 2;
}
echo $val1 . "<br>";
echo $val2;
?>
通常のブロックでのスコープがあるとすれば、最後のecho $val2
は存在しないため、出力されないはずですが、PHPでは2という表示が出ます。
つまり、if文やfor文でのブロックはローカルスコープとして認識されません。
関数などのローカルスコープは有効
ではどのような場合にローカルスコープが適用されるかというと、関数としてのブロックのみです。関数などのというのは、以降で学ぶメソッドに関しても同様のことが言えるからです。
関数のスコープでの動作を見てみましょう。
<?php
$val = "グローバルスコープです。";
function test_func() {
$val2 = "ローカルスコープです。";
echo $val . "<br>";
echo $val2 . "<br>";
}
test_func();
echo $val2;
?>
test_func
関数ではローカルスコープでの変数を$val2
で定義し、グローバルスコープの$val
とローカルスコープの$val2
を表示しようとしています。
1つ目のecho $val
は出力できません。関数内で外にある$val
が見えないからです。
そして最後の処理であるecho $val2
も出力できません。これは逆にローカルスコープである$val2
は、外からは見えないからです。
簡単にまとめると
- 通常のプログラミングで考えられるブロックでのスコープ(中括弧{}単位でのスコープ)は適用されない
- 関数などのローカルスコープは適用される。
- 関数内でも普通にグローバルスコープは使えない。
この3点を理解しておけばよいかと思います。
そして3点目の関数内でグローバルスコープが使えない点ですが、これに関しては解決方法があります。
global宣言で関数内でもグローバルスコープを使える
先程のPHPファイルを少し変えて見てみます。
<?php
$val = "グローバルスコープです。";
function test_func() {
$val2 = "ローカルスコープです。";
global $val;
echo $val . "<br>";
echo $val2 . "<br>";
}
test_func();
?>
ポイントはglobal $val;
です。このようにglobalキーワードを使うことで、グローバル変数である$val
を利用します!という意味になります。
これを実行すると何もエラーなく実行され、「グローバルスコープです。ローカルスコープです。」と表示されます。
まとめ
他のプログラミング言語でよくあるブロック単位でのスコープは適用されませんが、適用されるつもりでコードを書いてもそれほど影響はないかと思います。ただPHPだとコードが簡単にはなりますが。
globalキーワード以外に関しては、変数のスコープをそのまま理解するだけで十分実用的なコードが書けるでしょう。
タグ
-
前の記事
PHPのユーザー定義関数
-
次の記事
PHPのクラス