プログラミングにおいて、変数のスコープは重要です。変数の値をどこまで気にすればよいのか、宣言し代入した変数がどのあたりまで使えるのかを把握しやすくすることで、コードの品質も保たれます。 変数のスコープに関しては、プログラミングカテゴリーの記事でも説明しましたが、PHPの変数スコープは少しややこしいため、別記事としてPHPのスコープについて学んでいきます。

PHPのスコープ

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 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キーワード以外に関しては、変数のスコープをそのまま理解するだけで十分実用的なコードが書けるでしょう。