変数のスコープ

変数のスコープは、その変数が定義されたコンテキストです。 ほとんどの PHP 変数は、スコープを1つだけ有しています。 このスコープの範囲は、includeやrequireにより読みこまれたファイルも 含みます。例えば、


$a = 1;
include "b.inc";
    

この例で、変数$aはインクルードされた b.inc スクリプトの中でも 利用可能です。 しかし、ユーザー定義の関数の中では変数の有効範囲はローカル関数の中となります。 関数の中で使用された変数はデフォルトで有効範囲が関数内部に制限されます。 例えば、

 
$a = 1; /* グローバルスコープ */ 

Function Test () { 
    echo $a; /* ローカルスコープ変数の参照 */ 
} 

Test ();
     

このスクリプトは、出力を全く行いません。 これは、echo 命令がローカル版の $a 変数を参照しているにもかかわらず、 このスコープでは値が代入されていないからです。 この動作は、特にローカルな定義で上書きしない限りグローバル変数が 自動的に関数で使用可能である C 言語と少々異なっていると気がつかれる かもしれません。 C 言語のような場合、グローバル変数を不注意で変更してしまう という問題を生じる可能性があります。 PHP では、グローバル変数は、関数の内部で使用する場合、 関数の内部でグローバルとして宣言する必要があります。 例を以下に示します。


$a = 1;
$b = 2;

Function Sum () {
    global $a, $b;

    $b = $a + $b;
} 

Sum ();
echo $b;
     

上のスクリプトは、"3" を出力します。 関数の内部で $a、$b をグローバル宣言を行うことにより、 両変数への参照は、グローバル変数の方を参照することになります。 ある関数により操作できるグローバル変数の数は無制限です。

グローバルスコープから変数をアクセスする2番目の方法は、 PHP が定義する $GLOBALS 配列を使用することです。 先の例は、次のように書き換えることができます。


$a = 1;
$b = 2;

Function Sum () {
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 

Sum ();
echo $b;
     

$GLOBALS 配列は連想配列であり、グローバル変数の名前がキー、その変数の内容が 配列要素の値となっています。

変数のスコープに関する別の重要な機能は、 静的(static) 変数です。 静的変数はローカル関数スコープのみに存在しますが、 プログラム実行がこのスコープの外で行われるようになっても その値を失わないません。 次の例を見てください。


Function Test () {
    $a = 0;
    echo $a;
    $a++;
}
     

この関数は、コールされる度に $a を 0 にセットし、"0" を出力するので ほとんど役にたちません。 変数を1 増やす $a++ は、関数から外に出ると $a 変数が消えてしまうために 目的を達成しません。 現在のカウントの追跡ができるようにカウント関数を使用できるようにするためには、 $a 変数を静的に宣言します。


Function Test () {
    static $a = 0;
    echo $a;
    $a++;
}
     

こうすると、Test() 関数が呼ばれる度に、$a の値を出力し、 その値を増加させます。

静的変数は、再帰関数を実現する1つの手段としても使用されます。 再帰関数は、自分自身をコールする関数です。 再帰関数を書くときには、無限に再帰を行う可能性があるため、 注意する必要があります。 適当な方法により再帰を確実に終了させる必要があります。 次の簡単な関数は、中止するタイミングを知るために静的変数 $count を用いて、 10 回まで再帰を行います。


Function Test () {
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        Test ();
    }
    $count--;
}