ホームページ  >  記事  >  バックエンド開発  >  PHPのglobalと$GLOBALS[]の違いは何ですか?

PHPのglobalと$GLOBALS[]の違いは何ですか?

伊谢尔伦
伊谢尔伦オリジナル
2017-06-21 17:34:032365ブラウズ

1: 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; //正确,可以使用

2: グローバル問題分析:
質問:私は config.inc にいます。いくつかの変数 ($a) は .php で定義されています。他のファイルでは、関数外部 include("config.inc.php") が関数内でこれらの変数 $a を使用する必要があります。 echo $a を宣言しても何も出力されません。そこで、global $a を宣言しますが、関数も変数もたくさんありますので、このように繰り返し宣言することはできませんよね。何か良い解決策があればアドバイスをお願いします。
answer1: まず、config.inc.php で定数を定義します:define(定数名, 定数値)
次に、それを使用する必要がある他の場所で「config.inc.php」を要求します。
その後、それを直接使用できますこのファイルは定数です。
answer2: $x[a]、$x などの配列を定義する方法もあります。これにより、グローバル $x を宣言するだけで済みます。
答え 3: あなたの方法を試しましたが、うまくいきませんでした。
答え 4: php.ini ファイルを変更します。
3. Global 配列と $GLOBALS 配列の例
例: global

<?php 
$w3sky = 1; 
$w3sky2 = 2; 
function Sum() 
{ 
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2; 
}Sum(); 
echo $w3sky2; 
?>
を使用する

上記のスクリプトの出力は「3」になります。グローバル変数 $w3sky と $w3sky2 は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。 PHP では、関数が宣言できるグローバル変数の最大数に制限はありません。
グローバル スコープ内の変数にアクセスする 2 番目の方法は、特別な PHP カスタム $GLOBALS 配列を使用することです。前の例は次のように記述できます:
例 グローバル

<?PHP 
$w3sky = 1; 
$w3sky2 = 2;function Sum() 
{ 
$GLOBALS[&#39;w3sky&#39;] = $GLOBALS[&#39;w3sky&#39;] + $GLOBALS[&#39;w3sky2&#39;]; 
}Sum(); 
echo $w3sky2; 
?>
の代わりに $GLOBALS を使用します。 $GLOBALS 配列では、各変数は要素であり、キー名は

変数名 に対応し、値はその内容に対応します。変数。 $GLOBALS がグローバル スコープに存在する理由は、$GLOBALS が スーパーグローバル変数 であるためです。次の例は、スーパー グローバル変数の使用方法を示しています。 スーパー グローバル変数とスコープの例を示す例

<?PHP 
function test_global() 
{ 
// 大多数的
预定义变量
并不 "super",它们需要用 &#39;global&#39; 关键字来使它们在函数的本地区域中有效。 
global $HTTP_POST_VARS;echo $HTTP_POST_VARS[&#39;name&#39;];// Superglobals 在任何范围内都有效,它们并不需要 &#39;global&#39; 声明。Superglobals 是在 PHP 4.1.0 引入的。 
echo $_POST[&#39;name&#39;]; 
} 
?>

global つまり、ファイル内で global $db として宣言している限り、この $db をファイル内で参照できます。宣言データベース。

4. global と $GLOBALS は、書き方が違うだけで同じだと思っていましたが、実際のアプリケーションでは、この 2 つの違いは依然として非常に大きいことがわかりました。まず次の例を見てください。
実行結果は次のとおりです:

<?php 
// 例子1 
function test_global() { 
global $var1, $var2; 
$var2 =& $var1; 
} 
function test_globals() { 
$GLOBALS[&#39;var3&#39;] =& $GLOBALS[&#39;var1&#39;]; 
} 
$var1 = 5; 
$var2 = $var3 = 0; 
test_global(); 
print $var2 ."\n"; 
test_globals(); 
print $var3 ."\n"; 
?>

どうしてこれが起こるのでしょうか? 5 が 2 つあるはずではありませんか? どうやって 1 0 と 1 5 が存在するのでしょうか?
さて、上記の質問を維持して、$GLOBALS と global の原理を分析しましょう。

変数については誰もが知っています。実際、これはコード内で対応する物理メモリの「コード名」です。上で宣言した 3 つの変数によって割り当てられたメモリが次の図に示されているとします。

php マニュアルの $GLOBALS
:
グローバル変数: $GLOBALS
注: $ GLOBALS は、PHP 3.0.0 以降のバージョンで使用できます。 定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。 これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
グローバルが何をしたか分析しましょう?
PHP の関数によって生成された変数は関数のプライベート変数であることは誰もが知っていますが、グローバル キーワードによって生成された変数はこの規則を確実に回避できないのはなぜでしょうか。次のコードを見てください:

0 
5

結果は : 1
なぜ 1 が出力されるのですか? $a の設定が解除されていませんか?設定解除に失敗しましたか? PHPのバグ?
いいえ、実際には、unset は機能します。テスト関数の $a を設定解除します。

テストする関数の後にコードをコピーします。つまり、globalは$aのエイリアス変数「$a」をtest関数の外で生成し、test_globals実行後に変数の変化を見てみるということです。

この時点で、例 1 の実行後に $var2 が 0 で $var3 が 5 になる理由が理解できました。
それで、関数内の global と $GLOBALS[] の違いは次のとおりです:
global は、関数の実際の外部変数ではなく、関数の外部変数を指すエイリアス変数を関数内に生成します。エイリアス変数を変更してアドレスを指定すると、予期せぬ状況が発生します (なぜ出力結果が 2 になるのでしょうか。実際、$var1 の参照が $var2 の参照アドレスを指しているためです。その結果、この時点では、実際の値は変更されていません。$var2 を指すポインタはポインタを変更するだけですが、実際には $var2 の値はまったく変更されません。 $var2 はまだ変更されません)、たとえば、例 1.
$GLOBALS[] は実際に呼び出されます。これは外部変数であり、関数の内部と外部で常に一貫性が保たれます。


以上がPHPのglobalと$GLOBALS[]の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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