【6日でできるPHP入門】変数のスコープ

 複数の関数やファイルが絡む PHP プロジェクトでは「変数がどこで生きていて、どこで消えるのか」を正しく把握することが欠かせません。この有効範囲を スコープ (scope) と呼びます。ここではスコープの種類と制御方法を体系的に学び、意図せぬ変数の衝突やバグを未然に防げるコーディング力を身につけます。

1.スコープの基本

1.1. グローバル変数とローカル変数

用語説明典型的な宣言場所
グローバル変数スクリプト全体で参照可能関数の外側
ローカル変数定義した関数の内部でのみ有効関数の内部・引数

ファイル名: lesson45_1.php

<?php
$message = "グローバルです!";      // グローバル変数

function showMessage(){
    echo "関数内 \$message の値: ";
    echo isset($message) ? $message : "未定義"; // ローカルでは見えない
    echo "<br>";
}

showMessage();
echo "関数外 \$message の値: {$message}<br>";
?>

実行結果

関数内からは $message が見えない ― これがスコープによる制限です。

1.2. ローカル変数の寿命

ファイル名: lesson45_2.php

<?php
function makeCounter(){
    $count = 0;            // 毎回初期化されるローカル変数
    $count++;
    echo "カウント: {$count}<br>";
}
makeCounter(); // 1
makeCounter(); // 1  ← 前回の値は保持されない
?>

実行結果

呼び出しごとに $count がリセットされる点を確認してください。

1.3. スーパーグローバル変数

変数主な用途
$_GET, $_POST, $_REQUESTフォームや URL クエリの取得
$_SERVERサーバー情報・ヘッダー
$_SESSIONセッション管理
$_COOKIEクッキー管理
$_FILESファイルアップロード

これらは関数内外を問わず常に参照可能で、明示的に渡す必要がありません。

2.スコープを操作する構文

2.1. global キーワード

ファイル名: lesson45_3.php

<?php
$total = 0; // グローバル

function add($n){
    global $total; // 外側の $total を取り込む
    $total += $n;
    echo "合計(関数内): {$total}<br>";
}
add(5);
add(3);
echo "合計(関数外): {$total}<br>";
?>

実行結果

2.2. $GLOBALS 配列

ファイル名: lesson45_4.php

<?php
$rate = 1.08;

function calcTax(int $price){
    $taxed = $price * $GLOBALS['rate']; // 連想配列から直接参照
    echo "税込価格: {$taxed} 円<br>";
}
calcTax(1000); // 1080
?>

実行結果

2.3. static 変数

ファイル名: lesson45_5.php

<?php
function staticCounter(){
    static $num = 0; // 初回のみ 0 に初期化
    $num++;
    echo "staticカウンタ: {$num}<br>";
}
staticCounter(); // 1
staticCounter(); // 2
staticCounter(); // 3
?>

実行結果

キーワード働きよく使う場面
global関数内から外部変数を参照値の累積・設定更新
$GLOBALS連想配列として全グローバル変数にアクセス動的な変数名を扱う場合
static関数間で値を保持呼び出し回数のカウント、キャッシュ

3.よくある落とし穴と対策

3.1. 変数の衝突

同じ名前のグローバル変数を複数ファイルで定義すると上書きされる危険があります。
対策: 設定値は define() で定数化、または名前空間(クラスや名前空間機能)を利用。

3.2. 無意識のグローバル依存

関数内部で global を多用すると依存関係が読みにくくなります。
対策: 可能な限り引数と戻り値でデータを受け渡し、純粋関数に近づける。

まとめ

  • スコープは 変数の有効範囲 を決定し、バグの温床にもなる重要概念。
  • グローバルとローカルを区別し、global, $GLOBALS, static で必要最小限の範囲共有を行う。
  • スーパーグローバル変数は便利だが、適切なバリデーションを忘れないこと。