phpにおけるglobalと$GLOBALS[]の解析の1つ

5194 ワード

これはいくつかの問題を引き起こす可能性があります.一部の人はうっかりグローバル変数を変える可能性があります.PHPでグローバル変数を関数で使用する場合は、グローバルとして明示する必要があります(Globalというキーワードは関数で定義しておくと便利です).
1:Globalの役割は、グローバル変数を定義することですが、このグローバル変数はWebサイト全体ではなく、includeまたはrequireのすべてのファイルを含む現在のページに適用されます.
 
  
$a=123;
function aa()
{
Global $a; // $a global , $a , $a, , C , 。
echo $a;
}
aa();
?>

まとめ:関数体内で定義されたglobal変数は、関数体外で使用でき、関数体外で定義されたglobal変数は関数体内で使用できません.
 
  
$global $a;
$a=123;
function f()
{
echo $a; // ,
}
//
function f()
{
global $a;
$a=123;
}
f();
echo $a; // ,

2:global問題解析:
义齿inc.phpにはいくつかの変数($a)が定義されており、他のファイルでは関数外部include(「config.inc.php」)が定義されており、関数内部ではこれらの変数$aを使用する必要があり、宣言がなければecho$aは何も印刷できません.だからglobal$aを宣言しますが、多くの関数と多くの変数があり、このような宣言を繰り返してはいけませんか?何かいい解決策がありましたら、教えてください.
answer 1:config.inc.phpで定数を定義する:define(定数名、定数値)
他に必要な場所でinc.php',
そしてこのファイルでこの定数を直接使うことができます.
answer 2:私にも方法があります.$x[a],$xのような配列を定義することです.global$xを1つ宣言するだけです.
answer 3:この方法を試してみましたが、だめですね.
answer 4:phpを変更します.iniファイル.
3.Globalおよび$GLOBALS配列の例
例:globalの使用
 
  
$w3sky = 1;
$w3sky2 = 2;
function Sum()
{
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2;
}Sum();
echo $w3sky2;
?>

以上のスクリプトの出力は「3」になります.関数には、グローバル変数$w 3 skyおよび$w 3 sky 2が明記されており、任意の変数のすべての参照変数がグローバル変数に指向されます.1つの関数で明示できるグローバル変数の最大個数に対してPHPは制限されない.
変数にグローバルにアクセスする第2の方法は、$GLOBALS配列を特殊なPHPでカスタマイズすることです.前の例は次のように書くことができます.
例globalの代わりに$GLOBALSを使用する
 
  
$w3sky = 1;
$w3sky2 = 2;function Sum()
{
$GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2'];
}Sum();
echo $w3sky2;
?>

$GLOBALS配列では、各変数は要素であり、キー名は変数名に対応し、値は変数の内容に対応する.$GLOBALSがグローバル範囲内に存在するのは、$GLOBALSが超グローバル変数であるためである.次の例では、スーパーグローバル変数の使用方法を示します.
例超グローバル変数と役割ドメインの例を示す
 
  
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とは、1つのファイルでglobal$dbとして宣言すれば、宣言の下でこの$dbを参照することができます.
4.globalと$GLOBALSは書き方が違う以外は同じだと思っていたが、実際の応用では2つの違いが大きいことが分かった!
まず次の例を見てみましょう.
 
  
// 1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 ."
";
test_globals();
print $var3 ."
";
?>

実行結果:
0
5
どうしてこんなことになったの?2つの5ではないでしょうか.どうして1つの0と1つの5が現れますか?
はい、私たちは以上の問題を残して、$GLOBALSとglobalの原理を深く分析します!
変数は、対応する物理的に存在するコードの「コード」であることはよく知られています.上記で宣言した3つの変数に割り当てられたメモリは、次の図のように示されています.
phpマニュアルの$GLOBALSの解釈を参照してください.
Global変数:$GLOBALS
注意:$GLOBALSはPHP 3.0にある.0以降のバージョンで適用されます.
定義されたすべてのグローバル変数からなる配列.変数名は、その配列のインデックスです.
これは「superglobal」であるか、自動グローバル変数として記述できます.
つまり、上記のコードの$var 1と$GLOBALS['var 1']は、2つの異なる変数ではなく、同じ変数を指します!
次にglobalが何をしたのかを分析します.
phpの関数で生成される変数はすべて関数のプライベート変数であることはよく知られていますが、globalキーワードで生成される変数もこのルールから逃れられないに違いありません.なぜそう言うのか、次のコードを見てみましょう.
 
  
// 2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>

実行結果:
1
なぜ1を出力するのですか?もう$aをunsetにあげたんじゃないですか?unsetが機能しなくなったの?phpのバグ?
いいえ、実はunsetが役に立って、test関数の中の$aをunsetに落として、関数の後ろで加えることができます
print $a;
テストしよう!すなわちglobalはtest関数外部$aの別名変数「$a」を生成し,外部の$aと区別するためにtest->$aとしたが,例1もこのように命名すると,次の図が得られる.
そしてtest_globalsが実行した後、変数の変化を見ます.
このとき,図を見ると,なぜ例1が実行された後,$var 2が0であり,$var 3が5であるのかが理解できる.
そこで,関数におけるglobalと$GLOBALS[]の違いは,
globalは、真の関数外部変数ではなく、関数外部変数を指す別名変数を生成しますが、別名変数の指向アドレスを変更すると、予想外の状況が発生します.(なぜ印刷結果が2になるのか.実は$var 1の参照が$var 2の参照先を指すからである.実質的な値は変わらない.この場合は$var 1を指すポインタが$var 2を指すポインタを指すだけであり、ポインタが少し変わっただけであるが、実質的に$var 2の値はまったく変わらないので、$var 2の値は変わらない).例えば例1.
$GLOBALS[]は確かに外部の変数であり、関数の内外は常に一致しています.
注:(次に上記の例1に戻り、test_globalのこのコード「$var 2=&$var 1;」を参照してください.上記は参照付与演算である、すなわち$var 2はvar 1が指す物理メモリアドレスを指すので、例1はtest_global関数を実行した後、変数の変化は関数の局所的な効果のみを生じ、関数の外部で$var 2が指す物理メモリアドレスは変化していないのか、それともそれ自体なのかを示す.
次に上記の例1に戻り、test_globalのこのコード「$var 2=&$var 1;」を見て、上記は参照付与演算、すなわち$var 2がvar 1が指す物理メモリアドレスを指すので、例1がtest_global関数を実行した後、変数の変化は下図から分かる)
この1篇の分析のは透徹していないで、分からないのは《globalと$GLOBALS[]の分析の2》の中で1と3を挙げて分かりやすいことを見てください