昨夜そのような問題に遭遇しました。それは関数内のグローバル変数の問題でした。今日検索を行ったところ、PHP の変数スコープに関する非常に良い記事を見つけました。これはネチズンによって翻訳され、ここに投稿されました:
変数のスコープ
変数のスコープとは、変数が定義されているコンテキストのことです (翻訳者: 単刀直入に言うと、変数の有効スコープです)。ほとんどの PHP 変数にはスコープが 1 つだけあります。この単一スコープ スパンには、include および require によって導入されたファイルも含まれます。例:
}
;
Test();
?>
echo ステートメントは変数 $a のローカル バージョンを参照しており、このスコープ内の値が割り当てられていないため、このスクリプトは出力を生成しません。 PHP のグローバル変数は C 言語とは少し異なることに気づくかもしれません。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は関数内で自動的に有効になります。誰かが不用意にグローバル変数を変更する可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。
$b = $a + $b;
}
Sum();
echo $b;
上記のスクリプトの出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。 PHP では、関数が宣言できるグローバル変数の最大数に制限はありません。
例 12-2. global の代わりに $GLOBALS を使用します
コードをコピーします
}
Sum();
echo $b;
$GLOBALS 配列では、各変数は要素であり、キー名は変数名、値変数の内容に対応します。 $GLOBALS はスーパーグローバル変数であるため、$GLOBALS はグローバル スコープ内に存在します。次の例は、スーパーグローバル変数の使用を示しています:
コードをコピーします
Print $_POST['name'];
}?>
静的変数の使用
コードをコピーします
例 12-5. 静的変数の使用例
静的変数は、再帰関数を処理する方法も提供します。再帰関数は、それ自体を呼び出す関数です。再帰関数を作成するときは、無限に再帰する可能性があるので注意してください。再帰を終了する適切な方法があることを確認する必要があります。静的変数 $count を使用して、いつ停止するかを決定し、再帰的に 10 までカウントするこの単純な関数を考えてみましょう:
例 12-6. 静的変数と再帰関数
$count++;
echo $count;
if ($count < 10) {
Test ();
}
$count--;
}
?>
例 12-7. 静的変数を宣言する
echo $int;
}
?>
グローバル $obj;
$obj = 新しい stdclass;
}
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
var_dump($obj);
if (!isset($obj)) {
// 静的変数への参照を代入します
$obj = &new stdclass;
}
$obj-> ;property++;
$obj;
}
を返す
static $obj;
var_dump($obj);
if (!isset($obj)) {
// オブジェクトを静的変数に代入します
$obj = new stdclass;
}
$obj-> ;property++;
$obj;
}
を返す
$still_obj1 = get_instance_ref();
echo "/n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
上記の例を実行すると、次の出力が得られます:
Static object: NULLStatic object: NULLStatic object: NULLStatic object: object(stdClass)(1) { ["property"]=> int(1)}
;
上 この例は、参照が静的変数に割り当てられた場合、&get_instance_ref() 関数が 2 回目に呼び出されたときにその値が記憶されないことを示しています。