PHPのglobalキーワードを使うと、関数の内部からグローバルスコープ(関数の外側)にある変数にアクセスできます。PHPでは関数内と関数外で変数のスコープが分離されているため、通常は関数内から外部の変数を直接参照できません。
global はこのスコープの壁を超える手段ですが、コードの依存関係が見えにくくなるため、使用には注意が必要です。基本的には引数で値を渡す方法を優先し、global は限定的に使用することが推奨されます。
基本的な使い方
関数内で global 変数名; と宣言すると、グローバルスコープの変数を参照できるようになります。
<?php
$message = "こんにちは";
function showMessage() {
global $message;
echo $message . "\n";
}
showMessage();
こんにちは
global $message; を宣言しないと、関数内の $message は未定義となり、何も出力されません。
globalなしの場合との比較
<?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
$counter = 0;
function incrementWithGlobal() {
global $counter;
$counter++;
}
function incrementWithGlobals() {
$GLOBALS['counter']++;
}
incrementWithGlobal();
incrementWithGlobals();
incrementWithGlobal();
echo "カウンター: " . $counter . "\n";
カウンター: 3
global キーワードと $GLOBALS 配列は同じ効果がありますが、$GLOBALS は変数名を文字列で指定するため、動的に変数名を決定できるメリットがあります。
実用的な例
設定値やデータベース接続など、アプリケーション全体で共有する値にグローバル変数が使われることがあります。
<?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 を多用すると、関数がどの外部変数に依存しているか把握しづらくなり、テストやリファクタリングが困難になります。モダンPHPでは、引数で値を渡すか、クラスのプロパティとして管理するか、依存性注入(DI)を使う方法が推奨されます。
$_GET、$_POST、$_SESSION、$_SERVER などのスーパーグローバル変数は、global 宣言なしでどこからでもアクセスできます。これらはPHPが自動的に設定する特殊な変数で、通常のグローバル変数とは扱いが異なります。
まとめ
global 変数名;で関数内からグローバル変数にアクセスできる$GLOBALS配列でも同様のアクセスが可能- PHPの関数はデフォルトでローカルスコープを持ち、外部変数は見えない
globalの多用はコードの見通しを悪くするため、引数渡しやDIを優先する- スーパーグローバル変数は
global宣言なしでアクセス可能