変数のスコープは、その変数が定義されたコンテキストです。 ほとんどの 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();
}
}