基礎

PHPのglobalキーワード|関数内でグローバル変数を使用する方法

PHPのglobalキーワードを使うと、関数の内部からグローバルスコープ(関数の外側)にある変数にアクセスできます。PHPでは関数内と関数外で変数のスコープが分離されているため、通常は関数内から外部の変数を直接参照できません。

global はこのスコープの壁を超える手段ですが、コードの依存関係が見えにくくなるため、使用には注意が必要です。基本的には引数で値を渡す方法を優先し、global は限定的に使用することが推奨されます。

基本的な使い方

関数内で global 変数名; と宣言すると、グローバルスコープの変数を参照できるようになります。

PHP
<?php
$message = "こんにちは";

function showMessage() {
    global $message;
    echo $message . "\n";
}

showMessage();
実行結果
こんにちは

global $message; を宣言しないと、関数内の $message は未定義となり、何も出力されません。

globalなしの場合との比較

PHP
<?php
$value = 100;

function withoutGlobal() {
    // globalなし:関数内の$valueは未定義
    echo "globalなし: " . ($value ?? "未定義") . "\n";
}

function withGlobal() {
    global $value;
    echo "globalあり: " . $value . "\n";
}

withoutGlobal();
withGlobal();
実行結果
globalなし: 未定義
globalあり: 100

PHPの関数はデフォルトでローカルスコープを持つため、global を宣言しない限り外部変数にはアクセスできません。これはJavaScriptなど他の言語とは異なる点です。

$GLOBALS配列を使う方法

$GLOBALS スーパーグローバル配列を使っても、グローバル変数にアクセスできます。

PHP
<?php
$counter = 0;

function incrementWithGlobal() {
    global $counter;
    $counter++;
}

function incrementWithGlobals() {
    $GLOBALS['counter']++;
}

incrementWithGlobal();
incrementWithGlobals();
incrementWithGlobal();
echo "カウンター: " . $counter . "\n";
実行結果
カウンター: 3

global キーワードと $GLOBALS 配列は同じ効果がありますが、$GLOBALS は変数名を文字列で指定するため、動的に変数名を決定できるメリットがあります。

実用的な例

設定値やデータベース接続など、アプリケーション全体で共有する値にグローバル変数が使われることがあります。

PHP
<?php
// アプリケーション設定(グローバル変数)
$config = [
    "app_name" => "MyApp",
    "debug" => true,
    "version" => "1.0.0",
];

function getAppName(): string {
    global $config;
    return $config["app_name"];
}

function isDebugMode(): bool {
    global $config;
    return $config["debug"];
}

echo getAppName() . "\n";
echo "デバッグモード: " . (isDebugMode() ? "ON" : "OFF") . "\n";

// ただし、引数で渡す方がベター
function getAppNameBetter(array $config): string {
    return $config["app_name"];
}
echo getAppNameBetter($config) . "\n";
実行結果
MyApp
デバッグモード: ON
MyApp
globalの使用は最小限に

global を多用すると、関数がどの外部変数に依存しているか把握しづらくなり、テストやリファクタリングが困難になります。モダンPHPでは、引数で値を渡すか、クラスのプロパティとして管理するか、依存性注入(DI)を使う方法が推奨されます。

スーパーグローバル変数

$_GET$_POST$_SESSION$_SERVER などのスーパーグローバル変数は、global 宣言なしでどこからでもアクセスできます。これらはPHPが自動的に設定する特殊な変数で、通常のグローバル変数とは扱いが異なります。

まとめ

  • global 変数名; で関数内からグローバル変数にアクセスできる
  • $GLOBALS 配列でも同様のアクセスが可能
  • PHPの関数はデフォルトでローカルスコープを持ち、外部変数は見えない
  • global の多用はコードの見通しを悪くするため、引数渡しやDIを優先する
  • スーパーグローバル変数は global 宣言なしでアクセス可能