PHP のグローバル変数は C 言語とは少し異なります。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は自動的に有効になります。
これにより、不用意にグローバル変数を変更する可能性があります。 PHP のグローバル変数は、関数で使用する場合はグローバルとして宣言する必要があります (Global キーワードは関数で定義されている場合にのみ有効であることに注意してください)。
1: Global の機能はグローバル変数を定義することですが、このグローバル変数は Web サイト全体ではなく、現在のページ (include または require 内のすべてのファイルを含む) に適用されます。
<?PHP $a=123; function aa() {
Global $a; // $a がグローバル変数として定義されていない場合、関数本体は関数本体の外で $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.php でいくつかの変数 ($a) を定義し、他のファイルでは関数 external include("config .inc.php") の場合、これらの変数 $a は関数内で使用する必要があります。宣言されていない場合、echo $a は何も出力しません。そこで、global $a を宣言しますが、関数も変数もたくさんありますので、このように繰り返し宣言することはできませんよね。何か良い解決策があればアドバイスをお願いします。
answer1: まず config.inc.php で定数を定義します: (定数名、定数値) を定義します
次に、それを使用する必要がある他の場所で '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 配列を使用することです。前の例は次のように記述できます:
例 グローバルの代わりに $GLOBALS を使用します
<?PHP $w3sky = 1; $w3sky2 = 2;function Sum() { $GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2']; }Sum(); echo $w3sky2; ?>
$GLOBALS 配列では、各変数は要素であり、キー名は変数名に対応し、値は変数の内容に対応します。 $GLOBALS はスーパーグローバル変数であるため、$GLOBALS はグローバル スコープ内に存在します。次の例は、スーパー グローバル変数の使用を示しています。
スーパー グローバル変数とスコープの例を示す例
<?PHP function test_global() { // 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。 global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。 echo $_POST['name']; } ?>
global つまり、ファイル内でグローバル $db として宣言している限り、この $ を参照できます。宣言データベースの下。
4. global と $GLOBALS は、書き方が違うだけで同じだと思っていましたが、実際のアプリケーションでは、この 2 つの違いは依然として非常に大きいことがわかりました。まず次の例を見てください。
実行します 結果は次のとおりです:
0
5
これは 2 5 ではないでしょうか? 1 0 と 1 5 があるはずはありませんか?
さて、上記の質問をそのままにして、 を分析しましょう。 $GLOBALS とグローバルの原理を詳しく説明します。
変数が実際にはコード内の対応する物理メモリの「コード名」であることは誰もが知っています。上で宣言した 3 つの変数によって割り当てられたメモリが以下に示されていると仮定します。 PHP マニュアルの $GLOBALS の説明:
グローバル変数: $GLOBALS
注: $GLOBALS は PHP 3.0.0 以降で使用できます。
定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。
これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
グローバルが何をしたか分析しましょう?
PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているので、グローバル キーワードによって生成される変数はこの規則を確実に回避できないのはなぜでしょうか。次のコードを見てください。
<?php // 例子2 function test() { global $a; unset($a); } $a = 1; test(); print $a; ?>
执行结果为:
1
为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入
print $a;
复制代码
来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图:
而test_globals执行过以后,看变量的变化:
此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!
所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况(为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。这时候只是指向$var1的指针指向了$var2的指针,只是指针指向变了一下,但是实质上根本就没有改变$var2的值,因此$var2的值仍旧不会变化),例如例子1.
$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!
注:(接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.(重点)
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出)
以上がPHPでのglobalと$GLOBALS[]の例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。