作成日:2006/05/10
1E.8 変数のスコープ
基本的に、PHPの変数のスコープは2つしかありません。 グローバルスコープとローカルスコープです。 PHPはレキシカル変数宣言のない(サポートしていない)言語なでのローカル変数スコープの始まりが分かりません。 従って、C言語やPerlと異なり、ブロックレベルやファイルレベルのスコープという概念が存在しません。 PHPの変数のスコープとは、変数が関数の外側にあるか内側にあるかの違いだけです。
1E.8.1 スコープの種類
| スコープの種類 | 説明 |
|---|---|
| グローバル変数 |
関数の外側にある変数はグローバルスコープを持ちます。 関数の内側からグローバル変数をアクセスする第1の方法は、関数の中でglobalキーワードを使ってグローバル変数を宣言する事です。 関数の内側からグローバル変数をアクセスする第2の方法は、スーパーグローバル変数 $GLOBALS を使う方法です。 $GLOBALSは関数の内外を問わずに使用できます。 用例:
$a = 'global';
echo $a; // 'global'を出力します
echo $GLOBALS['a']; // 'global'を出力します
foo();
function foo(){
echo $GLOBALS['a']; // 'global'を出力します
echo $a; // 何の出力しません($aはローカル変数です)
global $a; // $aをグローバル変数宣言します
echo $a; // 'global'を出力します
}
|
| ローカル変数 |
関数の内側にある変数はローカルスコープを持ちます。 用例:
$a = 'global';
foo();
function foo(){
$a = 'local';
echo $a; // 'local'を出力します (ローカル変数)
echo $GLOBALS['a']; // 'global'を出力します(グローバル変数)
}
|
| スーパーグローバル変数 (自動グローバル) |
スーバーグローバル変数はPHPの定義済み変数で、 関数の内側でもglobal宣言なしで変数にアクセスできます。 用例:
foo();
function foo(){
echo $_REQUEST['PHPSESSID']; //セッションIDを表示
echo $_SERVER['REMOTE_ADDR']; //アクセス元のIPアドレスを表示
}
|
1E.8.2 ファイルレベルのスコープ
PHPにファイルレベルのスコープはありません。 変数のスコープは、その変数が現れたコンテキスト(関数の外側か内側か)に依存します。 この規則はincludeやrequireにより読みこまれたスクリプトにも適用されます。 (「スコープの継承」と呼ばれます)
用例:
inc.php
<?php echo $a; ?>
foo.php
<?php
$a = 'global';
include "inc.php"; // 'global'を出力します(inc.phpの$aはグローバル変数です)
foo();
function foo(){
$a = 'local';
include "inc.php"; // 'local'を出力します(inc.phpの$aはローカル変数です)
}
?>
1E.8.3 ネストされた関数の変数スコープ
PHPは関数内に関数(ネストされた関数)を定義する事ができます。 ネストされた関数でも変数のローカルスーコープは保障されます。 例えば、関数foo()の中で関数bar()が定義されている場合、 foo()内の変数$aとbar()内の変数$aは異なった変数になります。
用例:
function foo(){
function bar(){
$a = "bar";
echo $a; // 'bar'を出力します(aは関数bar()のローカル変数です)
}
$a = 'foo';
bar();
echo $a; // 'foo'を出力します($aは関数bar()によって上書きされません)
}
