ホームページ > バックエンド開発 > PHPチュートリアル > PHP 言語でのグローバルと $GLOBALS[] の分析

PHP 言語でのグローバルと $GLOBALS[] の分析

WBOY
リリース: 2016-06-13 13:05:45
オリジナル
804 人が閲覧しました

PHP 言語でのグローバルと $GLOBALS[] の分析
PHP の Global と $GLOBALS は書き方が異なるだけでなく、実際のアプリケーションではこの 2 つの違いに依然として大きな違いがあります。


まず次の例を見てください。 🎜>

<?php 
 // 例子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 .”\n”; 
 test_globals(); 
 print $var3 .”\n”; 
 ?>  
ログイン後にコピー


引用
実行結果は次のとおりです:
0

5

方法これは起こり得るでしょうか? いいえ、5 が 2 つあるはずです。どうして 1 0 と 1 5 があるのでしょうか?


それでは、上記の疑問を解決し、$GLOBALS と global の原則を詳しく分析していきます。 🎜>

変数は、実際にはコード内の対応する物理メモリの単なる「コード名」であることは誰もが知っています



PHP マニュアルの $GLOBALS の説明を引用
:

Quote
グローバル変数: $GLOBALS、注: $GLOBALS は PHP 3.0.0 以降のバージョンに適用されます。

定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。これは「スーパーグローバル」、または自動グローバル変数として説明できます。

つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。


グローバルが何をしたか分析してみましょう?



PHP マニュアルの global の説明を引用
:

引用
内に宣言が与えられている場合関数 グローバル変数への参照を割り当てます。この変数は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。
PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているので、グローバル キーワードによって生成される変数は間違いなくこの規則から逃れることはできません。なぜそう言えるのでしょうか? 以下を参照してください。コード:



 <?php 
 // 例子2 
 function test() { 
   global $a; 

   unset($a); 
 } 
 $a = 1; 

 test(); 

 print $a;
 ?>  
ログイン後にコピー

参照
実行結果は次のとおりです:

1

なぜ1が出力されるのでしょうか? $aの設定が解除されていませんか?設定解除に失敗しましたか? PHPのバグ?


なし 実際、unset は機能します。関数 test() に


print $ を追加できます。 🎜>
ぜひテストしてみてください!

上記の例 1 に戻って、test_global のコード "$var2 =& $var1;" を見てください。つまり、$var2 は物理メモリを指します。したがって、例 1 の test_global 関数を実行した後、変数の変更は関数内でローカルにのみ影響しますが、関数の外側で $var2 が指す物理メモリ アドレスは変更されず、そのままになります。 .


これ 例 1 を実行すると、$var2 が 0、$var3 が 5 になる理由がわかります。


したがって、関数内の global と $GLOBALS[] の違いは次のとおりであるという結論に達します。





global関数では、関数の実際の外部変数の代わりに関数の外部変数を指すエイリアス変数が生成され、エイリアス変数が指すアドレスが変更されると、予期せぬ事態が発生します。例 1 のような状況が発生します。


$GLOBALS[]呼び出しが外部変数であることは事実です関数の内部と外部で常に一貫性があります次の 2 つの例を比較して印象を深めてください:


グローバル:





出力: 何か
<?php

function myfunction(){

    global $bar;

    unset($bar);
}

$bar=”someting”;

myfunction();

echo $bar;
?>
ログイン後にコピー

$GLOBALS[]:




出力: 空
<?php

function foo()
{
    unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;

?>
ログイン後にコピー


上記の考え方に従って理解すると、次のような状況が発生します。また少し目まいがしませんか?



出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。
<?php
$a = 1;
$b = 2;

function Sum()
{
   global $a, $b;

   $b = $a + $b;
}
Sum();
echo $b;
?>
ログイン後にコピー


なぜ 2 ではないのでしょうか? $b は関数内で参照によって変更されていませんが、変更された $b は の値を指していることに注意してください。物理メモリなので外部入力は 3 です。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート