ホームページ > php教程 > php手册 > PHP の global と $GLOBALS[] の 1 つの分析

PHP の global と $GLOBALS[] の 1 つの分析

WBOY
リリース: 2016-06-13 12:02:54
オリジナル
885 人が閲覧しました

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

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


$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(); // 正しい、

2: グローバル問題分析:
質問: config.inc.php でいくつかの変数 ($a) を定義しましたが、他のファイルでは関数に ("config.inc.php" ) 外部で、これは関数内で必要です。これらの変数 $a を使用すると、宣言されていない場合、echo $a は何も出力しません。そこで、global $a を宣言しますが、関数も変数もたくさんあり、このように繰り返し宣言することはできませんよね。何か良い解決策があればアドバイスをお願いします。
答え 1: まず、config.inc.php で定数を定義します。define(定数名, 定数値)
次に、使用する必要がある他の場所で 'config.inc.php' を要求します。

次にこの定数はこのファイル内で直接使用できます。
answer2: $x[a]、$x などの配列を定義して、グローバル $x を宣言するだけで済むようにする方法もあります。
答え 3: あなたの方法を試しましたが、うまくいきませんでした。
答え 4: php.ini ファイルを変更します。
3. Global 配列と $GLOBALS 配列の例

例: グローバルを使用します



コードをコピーします

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

$w3sky = 1; $w3sky2 = 2;

function Sum()

{
global $w3sky, $w3sky2; $w3sky2 = $ w3sky $w3sky2;
}Sum();
echo $w3sky2;>


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


コードをコピーします

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

$w3sky = 1; $w3sky2 = 2; 関数 Sum() {

$GLOBALS['w3sky'] = $GLOBALS['w3sky' ] $GLOBALS['w3sky2'] ;

}Sum();
echo $w3sky2;>


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



コードをコピー


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

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

echo $_POST['name'];

}
?>


global つまり、ファイル内で global $ として宣言している限りこれで、この $db を参照できるようになります。
4. 私は当初、global と $GLOBALS は記述方法が異なることを除いて同じであると考えていましたが、実際のアプリケーションでは、この 2 つの違いは依然として非常に大きいことがわかりました。
次の例を見てください。最初:


コードをコピー

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


// 例 1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
🎜>関数 test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var2 = $var3 = 0;
test_global();
print $var2 ."n";
print $var3 ."n";


コードをコピーします
実行結果は次のとおりです:
0

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



コードをコピー

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

function test() {

グローバル $a;
$a = 1;
print $a; 🎜>

コードをコピー
実行結果は次のとおりです:
1
なぜ 1 が出力されるのですか? $a の設定が解除されていませんか?設定解除に失敗しましたか? PHPのバグ?
いいえ、実際には、unset は機能します。
print $a;
コードをコピーしてテストします。つまり、global はテスト関数の外側の $a に対してエイリアス変数 "$a" を生成し、それを --test->$a と呼びます。次の図が表示されます:
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 は、指定されている物理メモリを指します。したがって、例 1 の test_global 関数を実行した後、変数の変更は関数内でローカルにのみ影響しますが、関数の外側で $var2 が指す物理メモリ アドレスは変更されず、そのままになります。 (強調)
次に、上記の例 1 に戻り、test_global のコード「$var2 =& $var1;」を見てください。つまり、$var2 は物理的なものを指します。例 1 では、test_global 関数を実行した後、変数の変化が下の図で確認できます)
この記事の分析は十分ではありません。理解できない場合は、 「グローバルと $GLOBALS[] の分析 パート 2」を読んでください。一例から推測すると理解しやすいです。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート