変数のスコープ

変数のスコープは、その変数が定義されたコンテキストです。 ほとんどの PHP 変数は、単一のスコープのみを有しています。 しかし、ユーザー定義の関数の内部では、ローカル関数スコープが導入されます。 関数の内部で使用された全ての変数は、デフォルトでローカル関数のスコープ に制限されています。 例を以下に示します。

    $a=1; /* global scope */
    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 配列は、グローバル変数の名前をキーとし、その変数の内容が 配列要素の値となる連想配列です。

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

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

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

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

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

静的変数は、関数が再帰的にコールされる時にも必要不可欠です。 再帰関数は、自分自身をコールする関数です。 再帰関数を書くときには、無限に再帰を行う可能性があるため、 注意する必要があります。 適当な方法により再帰を確実に終了させる必要があります。 次の簡単な関数は、10 回まで再帰を行います。

    Function Test() {
        static $count=0;

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