【PHP】変数のスコープについて詳しく解説【関数】
- 変数のスコープとは?
- ローカルスコープ
- グローバルスコープ
- global キーワード
- 静的スコープ (static 変数)
- スーパーグローバル変数
- 関数の引数のスコープ
- 無名関数(クロージャ)のスコープ
- まとめ
変数のスコープとは?
変数のスコープとは、その変数がどこでアクセスできるかを示す範囲のことです。PHPでは主に次のスコープが存在します。
- ローカルスコープ
- グローバルスコープ
- 静的スコープ
- スーパーグローバル変数
それぞれのスコープについて詳しく見ていきましょう。
ローカルスコープ
関数内で定義された変数は、その関数の内部でのみアクセスできます。これをローカルスコープと呼びます。
function example() {
$localVar = "これはローカル変数です";
echo $localVar;
}
example(); // "これはローカル変数です" と表示される
echo $localVar; // エラー: 未定義の変数
関数の外部から $localVar
にアクセスしようとすると、エラーになります。
グローバルスコープ
関数の外で宣言された変数は、スクリプト全体で有効ですが、関数の内部では直接アクセスできません。
$globalVar = "これはグローバル変数です";
function example() {
echo $globalVar; // エラー: 未定義の変数
}
example();
このように、関数内から直接グローバル変数にアクセスすることはできません。
global キーワード
関数内でグローバル変数を使用したい場合は、global
キーワードを使用します。
$globalVar = "これはグローバル変数です";
function example() {
global $globalVar;
echo $globalVar; // "これはグローバル変数です" と表示される
}
example();
global
を使うことで、関数の内部からグローバル変数にアクセスできます。
静的スコープ (static 変数)
通常、関数のローカル変数は関数が終了すると破棄されます。しかし、static
キーワードを使うと、関数の呼び出しごとに値が保持されます。
function counter() {
static $count = 0;
$count++;
echo $count . "
";
}
counter(); // 1
counter(); // 2
counter(); // 3
static
変数は関数の外部からはアクセスできませんが、関数の中では前回の値を保持し続けます。
スーパーグローバル変数
PHPには、スクリプトのどこからでもアクセス可能なスーパーグローバル変数があります。代表的なものを紹介します。
$_GET
: クエリパラメータの取得$_POST
: フォームデータの取得$_SESSION
: セッションデータの管理$_COOKIE
: クッキー情報の取得
// URL: example.com/index.php?name=PHP
echo $_GET["name"]; // "PHP" と表示される
スーパーグローバル変数はどこでも利用できるため、スコープの概念を超えてアクセス可能です。
関数の引数のスコープ
関数の引数として渡された変数もローカルスコープになります。
function greet($name) {
echo "こんにちは、" . $name . "さん!";
}
greet("太郎"); // "こんにちは、太郎さん!"
関数の外部から引数を参照することはできません。
無名関数(クロージャ)のスコープ
PHPでは無名関数(クロージャ)を使って、スコープ内の変数を use
キーワードで外部から参照できます。
$message = "こんにちは";
$greet = function() use ($message) {
echo $message . "!";
};
$greet(); // "こんにちは!"
use
を使わないと、無名関数内で外部変数を参照できません。
まとめ
PHPの変数スコープは、コードの可読性やバグの防止に重要な概念です。以下のポイントを押さえましょう。
- 関数内の変数はローカルスコープ
- 関数の外の変数はグローバルスコープ
- 関数内でグローバル変数を使うには
global
を使う - 静的変数 (
static
) は関数内で値を保持できる - スーパーグローバル変数はどこからでもアクセス可能
- 無名関数では
use
を使って外部変数を参照できる
PHPのスコープを正しく理解し、適切に変数を管理しましょう。