ホームページ >バックエンド開発 >PHPチュートリアル >global と $GLOBAL[''] についてのいくつかの異なる理解
PHP のグローバル変数は、関数で使用する場合はグローバルとして宣言する必要があります (キーワード Global は関数で定義されている場合にのみ役立ちます)。
Global はグローバル変数の定義に使用されますが、このグローバル変数は Web サイト全体ではなく、現在のページ (include または require 内のすべてのファイルを含む) に適用されます。
<?PHP $a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a, //此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 echo $a; } aa(); ?>
関数本体内で定義されたグローバル変数は関数本体外で使用できます。関数本体外で定義されたグローバル変数は関数本体内では使用できません。
$global $a; $a=123; function f() { echo $a; //错误, } //再看看下面一例 function f() { global $a; $a=123; } f(); echo $a; //正确,可以使用
比較例:
<?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1; ?>
$var1 が削除されたため、何も出力されません。
<?php $var1 = 1; function test(){ global $var1; unset($var1); } test(); echo $var1; ?>
誤って1を印刷してしまいました。これは、エイリアス参照のみが削除され、その値がまったく変更されていないことを証明します。
global $var は実際には &$GLOBALS['var'] であり、これは外部変数を呼び出すための単なるエイリアスです。上記のコードの
$var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
PHP のグローバル変数は C 言語とは少し異なります。 C 言語では、ローカル変数でカバーされていない限り、グローバル変数は関数内で自動的に有効になります。誰かが不用意にグローバル変数を変更してしまう可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数を関数で使用する場合は、global を使用してグローバル変数として宣言する必要があります。
PHP のグローバル変数はグローバル変数の定義に使用されますが、このグローバル変数は Web サイト全体ではなく、現在のページ (include または require 内のすべてのファイルを含む) に適用されます。
PHP マニュアルの $GLOBALS の説明を引用します:
グローバル変数: $GLOBALS、注: $GLOBALS は PHP 3.0.0 以降のバージョンに適用されます。
定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。
php の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているため、global キーワードによって生成される変数は、このルールを確実に回避できません。global は、関数の外部変数を指すエイリアス変数を関数内に生成します。実際の関数の外部変数の場合、エイリアス変数のポインティング アドレスが変更されると、$GLOBALS[] は実際に外部変数と呼ばれ、関数の内部と外部で常に一貫性を保ちます。
<?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; ?>
出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。
なぜ 2 ではないのでしょうか? 関数の外では影響がないのでしょうか? $b は関数内で参照によって変更されていませんが、変更された $b は物理メモリの値を指していることに注意してください。は3です。
したがって、関数内の global と $GLOBALS[] の違いは次のような結論に達します:
global は、関数の実際の外部変数の代わりに、関数の外部変数を指すエイリアス変数を関数内に生成します。エイリアスが変更されると、変数がアドレスを指す場合、予期しない状況が発生します。
$GLOBALS[] は確かに外部変数と呼ばれ、関数の内部と外部で常に一貫性があります。