目次
1. 本記事のポイント
- PHPの変数スコープの種類(global, static, superglobal)を整理
- 実行時のスコープの動きと、使い分けの設計判断を具体例で解説
- よくある誤解や落とし穴も合わせて確認
2. PHPの変数スコープとは?
PHPでは、変数がどこで宣言・使用されるかによってスコープ(有効範囲)が異なります。
特に、関数内外での変数の挙動には明確なルールがあり、無理解のまま使うと意図しない動作を招きやすくなります。
主なスコープの種類は以下の3つです:
- ローカルスコープ:関数やメソッド内で宣言された変数は、その関数の中でのみ有効です。
- グローバルスコープ(global):関数の外で宣言された変数。関数内でアクセスするには
global
宣言が必要です。 - 静的スコープ(static):関数内で
static
修飾子付きで宣言された変数は、関数呼び出しのたびに初期化されず、前回の値が保持されます。 - スーパーグローバル(superglobal):
$_GET
や$_POST
など、PHPがグローバルに提供する予約済み変数群です。
実務では、スコープの誤解がバグの原因になるケースが多く、明示的に使い分ける意識が重要です。
3. 詳細解説
グローバル変数とglobal宣言
関数内でグローバル変数にアクセスするには、global
キーワードが必要です。
PHP
$a = 10;
function showGlobal() {
global $a; // 外の$aを参照
echo $a; // 出力: 10
}
showGlobal();
グローバル変数を直接関数内で使うと、未定義として扱われます。明示的にglobal
を指定することでアクセスできます。
静的変数(static)の動作
関数の呼び出し間で値を保持する用途に便利です。
PHP
function counter() {
static $count = 0;
$count++;
echo $count . "\n";
}
counter(); // 出力: 1
counter(); // 出力: 2
counter(); // 出力: 3
毎回初期化される通常のローカル変数と異なり、static
変数は関数のスコープ内に閉じながらも状態を保持します。
スーパーグローバル変数の使用例
POSTデータなどにアクセスする場合に使用します。
PHP
// フォームからのPOSTデータを受け取る
$name = $_POST['name'] ?? '未入力';
echo htmlspecialchars($name);
スーパーグローバル変数は常にグローバルスコープに存在し、関数内でも直接アクセス可能です。
4. よくあるミス・誤解・落とし穴
global
キーワードの省略により、関数内で変数が未定義になるstatic
を使い忘れて毎回初期化されてしまう- スーパーグローバル変数に直接代入して状態を持たせようとする(設計上避けるべき)
$_POST
や$_GET
に未定義キーをアクセスしてundefined index
エラーが出る
また、グローバル変数の多用は可読性・保守性を下げるため、原則的に関数間の状態共有には依存注入や戻り値の活用が推奨されます。
5. まとめ
PHPの変数スコープは、コードの見通しや意図の明示に直結する重要な概念です。global
は関数内での外部変数参照に必須、static
は状態保持に有効、スーパーグローバルはリクエスト情報の受け口として機能します。
特にグローバル変数とスーパーグローバルの使い分けは設計に影響するため、スコープの特性を正確に理解して使い分けましょう。