PHP の関数のスコープを完全解説!ローカル変数とグローバル変数の違いとは?
新人
「PHP の変数って、どこでも使えるんですか?」
先輩
「いい質問だね!変数には使える範囲、つまり スコープ という概念があるんだ。」
新人
「スコープ? それってどういうことですか?」
先輩
「スコープには、大きく分けて ローカル変数 と グローバル変数 があるんだよ。まずはローカル変数から説明しよう!」
1. 変数のスコープとは?
PHP の変数は、定義された場所によって「どこで使用できるか」が決まります。これを スコープ(有効範囲)と呼びます。
PHP では主に次の 2 種類のスコープがあります。
- ローカルスコープ(関数の中で定義された変数)
- グローバルスコープ(関数の外で定義された変数)
まずはローカルスコープについて詳しく見ていきましょう。
2. PHP のローカル変数とは?
ローカル変数は 関数の中で定義され、その関数の中だけで使える変数 のことです。関数の外からはアクセスできません。
例えば、以下のコードを見てみましょう。
<?php
function myFunction() {
$localVar = "私はローカル変数です";
echo $localVar; // 正常に出力される
}
myFunction();
echo $localVar; // エラー!関数の外では使えない
?>
このコードを実行すると、次のような結果になります。
私はローカル変数です
Fatal error: Uncaught Error: Undefined variable $localVar
関数内では $localVar
が正常に出力されますが、関数の外では使えないため、エラーが発生します。
3. ローカル変数の特徴
ローカル変数には、次のような特徴があります。
- 関数の中で定義される。
- 関数の外では使えない。
- 関数が実行されるたびに新しい変数として扱われる。
では次に、グローバル変数について説明します!
3. PHP のグローバル変数とは?
グローバル変数とは、関数の外で定義され、スクリプト全体で利用できる変数のことです。通常、関数の外で定義された変数は、関数内では直接アクセスできません。
例えば、以下のコードを見てみましょう。
<?php
$globalVar = "私はグローバル変数です";
function myFunction() {
echo $globalVar; // エラーが発生する
}
myFunction();
?>
このコードを実行すると、次のようなエラーが発生します。
Fatal error: Uncaught Error: Undefined variable $globalVar
このエラーは、関数内からグローバル変数 $globalVar
に直接アクセスできないために発生します。PHP では関数内でグローバル変数を使うには、特別な方法が必要です。
4. PHP でグローバル変数を関数内で使う方法
関数内でグローバル変数を使う方法として、以下の 2 つの方法があります。
global
キーワードを使う$GLOBALS
配列を使う
1. global キーワードを使う
global
キーワードを使うと、関数内でグローバル変数にアクセスできます。
<?php
$globalVar = "私はグローバル変数です";
function myFunction() {
global $globalVar;
echo $globalVar; // 正常に出力される
}
myFunction();
?>
このコードを実行すると、次のように表示されます。
私はグローバル変数です
global $globalVar;
を関数内で宣言することで、グローバル変数にアクセスできるようになります。
2. $GLOBALS 配列を使う
$GLOBALS
配列を使うと、関数内からグローバル変数にアクセスできます。$GLOBALS
はスーパーグローバル変数で、すべてのスクリプト内で利用可能です。
<?php
$globalVar = "私はグローバル変数です";
function myFunction() {
echo $GLOBALS['globalVar']; // 正常に出力される
}
myFunction();
?>
このコードを実行すると、次のように表示されます。
私はグローバル変数です
$GLOBALS['変数名']
を使うことで、関数内からグローバル変数にアクセスできます。
5. PHP の関数とスコープの違い
ローカル変数とグローバル変数の違いについて、もう一度整理しましょう。
変数の種類 | 定義場所 | 使用可能な範囲 |
---|---|---|
ローカル変数 | 関数の中 | 関数の中のみ |
グローバル変数 | 関数の外 | 関数の外のみ(global や $GLOBALS を使えば関数内でも可) |
また、関数のスコープに関して注意すべき点がいくつかあります。
- 関数内で定義された変数は、関数が実行されるたびに新しく作成される。
- グローバル変数はプログラム全体で共有されるため、不適切に使用すると意図しないバグを引き起こす可能性がある。
- 関数の引数を使えば、グローバル変数を関数に渡すこともできる。
関数の引数を使ってデータを渡す方法
関数のスコープを適切に管理するためには、グローバル変数を直接使うのではなく、関数の引数 を利用するのが良い方法です。
<?php
$globalVar = "私はグローバル変数です";
function myFunction($var) {
echo $var; // 関数の引数を利用する
}
myFunction($globalVar);
?>
このコードを実行すると、次のように表示されます。
私はグローバル変数です
関数の引数を利用すると、グローバル変数を直接参照することなくデータを受け渡すことができ、スコープの管理がしやすくなります。
6. 静的変数(static 変数)とは?
PHP では、関数が実行されるたびにローカル変数は新しく作成され、前回の値は失われます。しかし、static
キーワードを使うことで、関数の呼び出しをまたいでも変数の値を保持できます。
例えば、以下のコードを見てみましょう。
<?php
function counter() {
static $count = 0;
$count++;
echo "現在のカウント: $count<br>";
}
counter();
counter();
counter();
?>
このコードを実行すると、次のような結果になります。
現在のカウント: 1
現在のカウント: 2
現在のカウント: 3
通常のローカル変数を使った場合は、関数を呼び出すたびに値がリセットされますが、static
を使うことで値が保持され、カウントが増えていくのがわかります。
静的変数の特徴:
- 関数の外部からはアクセスできない(ローカルスコープを持つ)
- 関数が呼ばれるたびに値が保持される
- プログラムの実行が終了するまで値が保持される
7. スコープを理解するための実践例
これまでの内容を踏まえ、関数のスコープに関する動作をまとめた実践例を紹介します。
<?php
$globalVar = "グローバル変数";
function testScope() {
$localVar = "ローカル変数";
static $staticVar = 0;
global $globalVar;
$staticVar++;
echo "関数内のローカル変数: $localVar<br>";
echo "関数内のグローバル変数: $globalVar<br>";
echo "関数内の静的変数: $staticVar<br>";
echo "<br>";
}
testScope();
testScope();
testScope();
?>
このコードを実行すると、次のような結果になります。
関数内のローカル変数: ローカル変数
関数内のグローバル変数: グローバル変数
関数内の静的変数: 1
関数内のローカル変数: ローカル変数
関数内のグローバル変数: グローバル変数
関数内の静的変数: 2
関数内のローカル変数: ローカル変数
関数内のグローバル変数: グローバル変数
関数内の静的変数: 3
ポイント:
localVar
(ローカル変数)は、関数が実行されるたびにリセットされるglobalVar
(グローバル変数)は、関数外で定義されており、global
キーワードで関数内からも参照できるstaticVar
(静的変数)は、関数を呼び出すたびに値が保持される
このように、関数のスコープを適切に理解することで、プログラムの動作を予測しやすくなります。
8. PHP の変数スコープを学ぶためのおすすめの方法
変数スコープの理解を深めるには、実際にコードを書いて試すことが重要です。以下の方法を試してみましょう。
1. 実際にコードを書いて動作を確認する
ローカル変数・グローバル変数・静的変数を意識しながら、異なるスコープの変数を使ったプログラムを作成してみましょう。
2. PHP の公式ドキュメントを読む
PHP の公式ドキュメント では、変数スコープについて詳しく解説されています。具体的な例も豊富なので、参考になります。
3. デバッグツールを活用する
PHP でデバッグを行う際に、var_dump()
や print_r()
を使うと、変数の値を確認しながら学習できます。
<?php
$testVar = "デバッグ用の変数";
var_dump($testVar);
?>
このコードを実行すると、次のように出力されます。
string(21) "デバッグ用の変数"
デバッグツールを使うことで、変数の値やスコープをより正確に把握できます。
4. 小さなプログラムを作成してテストする
例えば、関数を使って計算処理を行うプログラムを作成し、ローカル変数・グローバル変数・静的変数の動作を比較してみると理解が深まります。
5. オンラインの学習サイトで練習する
プログラミングの学習サイト(Progate、Paiza、PHPマニュアルなど)で、PHP のスコープに関する練習問題を解いてみるのもおすすめです。
これらの方法を活用して、PHP の変数スコープをしっかりと理解していきましょう!