ホームページ >バックエンド開発 >PHPチュートリアル >PHP学習用のグローバル変数
PHP のグローバル変数は C 言語とは少し異なります。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は関数内で自動的に有効になります。これにより問題が発生する可能性があり、誰かが誤ってグローバル変数を変更してしまう可能性があります。したがって、PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。
次の例を見てください:
<?php$a = 1; /* global scope */function Test(){ echo $a; /* reference to local scope variable */}Test();?>
echo ステートメントは変数 $a のローカル バージョンを参照しており、このスコープ内にあるため、このスクリプトは出力を生成しません。 、値は割り当てられません。
グローバルを使用する別の例を見てください:
例 #1 グローバルを使用する
<?php$a = 1;$b = 2;function Sum(){ global $a, $b; $b = $a + $b;}Sum();echo $b;?>
それは「3」です。グローバル変数 $a および $b が関数内で宣言されると、いずれかの変数へのすべての参照がそのグローバル バージョンを指します。 PHP では、関数が宣言できるグローバル変数の最大数に制限はありません。
グローバル スコープ内の変数にアクセスする 2 番目の方法は、特別な PHP カスタム $GLOBALS 配列を使用することです。前の例は次のように記述できます:
例 #2 グローバル
<?php$a = 1;$b = 2;function Sum(){ $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];}Sum();echo $b;?>
の代わりに $GLOBALS を使用します
$GLOBALS は連想配列であり、各変数は要素です。キー名は変数名に対応し、値は変数の内容に対応します。 $GLOBALS はスーパーグローバル変数であるため、$GLOBALS はグローバル スコープ内に存在します。次の例は、スーパーグローバル変数の使用法を示しています:
例 #3 スーパーグローバル変数とスコープを示す例
<?phpfunction test_global(){ // 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。 global $HTTP_POST_VARS; echo $HTTP_POST_VARS['name']; // Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。 echo $_POST['name'];}?>
グローバル変数の参照
注意してください:関数内でグローバルとして宣言された変数に参照が割り当てられると、その参照は関数内でのみ表示されます。
PHP4 を駆動する Zend エンジン バージョン 1 では、変数の静的定義とグローバル定義は参照によって実装されます。たとえば、関数スコープ内の global ステートメントを使用してインポートされた真のグローバル変数は、実際にグローバル変数への参照を確立します。次の例に示すように、これにより予期しない動作が発生する可能性があります。
<?phpfunction test_global_ref() { global $obj; $obj = &new stdclass;}function test_global_noref() { global $obj; $obj = new stdclass;}test_global_ref();var_dump($obj);test_global_noref();var_dump($obj);?>
上記のルーチンは次のように出力します。
NULL
object(stdClass)(0) {
初めて NULL が出力されるのは、global $var; が $var =& $GLOBALS['var']; の略称であるためです。したがって、別の参照を $var に代入しても、ローカル変数 $var への参照が変更されるだけです。
つまり、ステートメント $obj = &new stdclass; はローカル変数 $obj のポイントを変更し、ステートメント global $obj によって引き起こされた効果は上書きされます。
静的 ステートメントにも適用されます。参照は静的に保存されません:
<?phpfunction &get_instance_ref() { static $obj; echo 'Static object: '; var_dump($obj); if (!isset($obj)) { // 将一个引用赋值给静态变量 $obj = &new stdclass; } $obj->property++; return $obj;}function &get_instance_noref() { static $obj; echo 'Static object: '; var_dump($obj); if (!isset($obj)) { // 将一个对象赋值给静态变量 $obj = new stdclass; } $obj->property++; return $obj;}$obj1 = get_instance_ref();$still_obj1 = get_instance_ref();echo "\n";$obj2 = get_instance_noref();$still_obj2 = get_instance_noref();?>
上記のルーチンは次のように出力します:
静的オブジェクト: NULL
静的オブジェクト:
静的オブジェクト: NULL
静的オブジェクト: object(stdClass)(1) {
["プロパティ"]=>
int(1)
}