ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルの global と $GLOBALS[] の 1 つの分析

php_PHP チュートリアルの global と $GLOBALS[] の 1 つの分析

WBOY
WBOYオリジナル
2016-07-21 15:21:34696ブラウズ

誰かが不用意にグローバル変数を変更する可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数は、関数で使用する場合はグローバルとして宣言する必要があります (Global キーワードは関数で定義されている場合にのみ有効であることに注意してください)。
1: Global の機能はグローバル変数を定義することですが、このグローバル変数は Web サイト全体ではなく、現在のページ (include または require 内のすべてのファイルを含む) に適用されます。

コードをコピーします コードは次のとおりです:

$a=123;
function aa()
{ //$a がグローバルとして定義されていない場合変数、関数本体 関数本体の外から $a にアクセスすることはできませんが、同じ名前の $a を定義することができます。このとき、この変数はローカル変数であり、C 言語のローカル変数に相当し、関数本体内で使用されます。
echo $a;
}
aa();
コードをコピーします

コードは次のとおりです:
$global $a=123; $a; //エラー、
}
//次の例をもう一度見てください
function f(){ $a=123; f();正解です。 を使用できます。
2: グローバル問題分析:
質問: いくつかの変数 ($a) が inc.php で定義されています。他のファイルでは、関数 external 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 を使用します



コードをコピーします

コードは次のとおりです:


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

コードをコピーします コードは次のとおりです。
$w3sky = 1; ;関数 Sum()
$GLOBALS['w3sky'] = $GLOBALS['w3sky']
}Sum();


; $GLOBALS 配列では、各 A 変数は要素であり、キー名は変数名に対応し、値は変数の内容に対応します。 $GLOBALS はスーパーグローバル変数であるため、$GLOBALS はグローバル スコープ内に存在します。次の例は、スーパーグローバル変数の使用法を示しています。
スーパーグローバル変数とスコープの例を示す例


コードをコピー

コードは次のとおりです:

function test_global() { // Largeほとんどの事前定義変数は「スーパー」ではなく、関数のローカル スコープで使用できるようにするには「global」キーワードが必要です。 global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// スーパーグローバルはどのスコープでも有効であり、「グローバル」宣言は必要ありません。スーパーグローバルは PHP 4.1.0 で導入されました。
echo $_POST['name'];
}
?>


global つまり、ファイル内で 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;
test_global();
print $var2 ."n"; "n";
?>


実行結果は次のとおりです:
0
5
5 が 2 つあるはずはありませんか? 、上記の質問を保持し、$GLOBALS とグローバルの原理を詳細に分析します。変数が実際にはコード内の対応する物理メモリの「コード名」であることは誰もが知っています。宣言した 3 つの変数によってメモリが割り当てられると仮定します。上記は以下の図に示されているとおりです。
PHP マニュアルの $GLOBALS の説明を引用:
グローバル変数: $GLOBALS
注: $GLOBALS は PHP 3.0.0 以降のバージョンで適用されます。
定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。
これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
グローバルが何をしたか分析しましょう?
PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているので、グローバル キーワードによって生成される変数はこの規則を回避できないのはなぜでしょうか。次のコードを見てください。コード

コードは次のとおりです。


// 例 2
function test() {
global $a;
$a = 1; ); print $a;> コードをコピーします 実行結果は次のとおりです:
1
なぜ 1 が出力されるのですか? $a の設定が解除されていませんか?設定解除に失敗しましたか? PHPのバグ?
いいえ、実際には、unset は機能します。テスト関数で $a を設定解除します。
コードをコピー
してください。つまり、global はテスト関数の外側の $a に対してエイリアス変数 "$a" を生成します。これを --test->$a に変更しました。次の図が表示されます:
test_globals が実行された後、変数の変化を見てください:
この時点で、図を見ると、例 1 の実行後に $var2 が 0 である理由がわかります。 、$var3 は 5!
それで、関数内の global と $GLOBALS[] の違いは次のとおりです:
global は、関数の実際の外部変数ではなく、関数の外部変数を指すエイリアス変数を関数内に生成します。エイリアス変数を変更すると、そのアドレスを指すと、予期せぬ状況が発生します (なぜ出力結果が 2 になるのでしょうか? 実際、$var1 の参照が $var2 の参照アドレスを指しているためです。その結果)この時点では、実際の値は変化していません。$var2 を指すポインタはポインタを変更するだけですが、実際には $var2 の値はまったく変化しません。 $var2 の値はまだ変化しません)、たとえば、例 1.
$GLOBALS[] は実際に呼び出されます。これは外部変数であり、関数の内部と外部で常に一貫性が保たれます。
注: (上記の例 1 に戻って、test_global のコード「$var2 =& $var1;」を見てください。上記は参照割り当て操作です。つまり、$var2 は、 が指す物理メモリ アドレスを指します。したがって、例 1 で test_global 関数が実行された後、変数の変更は関数内でローカルにのみ影響します。関数の外側で $var2 が指す物理メモリ アドレスは変更されません。キーポイント)
次に、上記の例 1 に戻り、test_global のコード「$var2 =& $var1;」を見てください。つまり、$var2 は、指定された物理メモリ アドレスを指します。したがって、例 1 の test_global 関数を実行した後の変数の変化は、以下の図から確認できます)
この分析は十分ではありません。理解できない場合は、「グローバルと変数の分析」を読んでください。 $GLOBALS[] パート 2」。1 つの例から推測することで簡単に理解できます。



http://www.bkjia.com/PHPjc/324879.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/324879.html

技術記事

誰かが不用意にグローバル変数を変更する可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数は、関数で使用する場合はグローバルとして宣言する必要があります (キーワード Global が関数で使用されることに注意してください...

)

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