ホームページ  >  記事  >  バックエンド開発  >  global と $GLOBAL[''] についてのいくつかの異なる理解

global と $GLOBAL[''] についてのいくつかの異なる理解

伊谢尔伦
伊谢尔伦オリジナル
2017-01-16 14:55:201970ブラウズ

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[&#39;var1&#39;]); 
} 
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[] は確かに外部変数と呼ばれ、関数の内部と外部で常に一貫性があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。