ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルでの global と $GLOBALS の違いの分析

php_PHP チュートリアルでの global と $GLOBALS の違いの分析

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-07-13 10:56:44
オリジナル
1074 人が閲覧しました

これら 2 つは実際には書き方の違いであると言う人もいました。必要な友達は、具体的に参照してください。

公式説明によると

1.$GLOBALS['var'] は外部グローバル変数そのものです。

2.global $var は、外部 $var と同じ名前の参照またはポインターです。

まず以下の例を見てください:

例を挙げてみましょう:

コードは次のとおりです コードをコピー
$var1 = 1; $var2 = 2; 関数テスト(){
$GLOBALS['var2'] = &$GLOBALS['var1']; }
テスト(); $var2 をエコーし​​ます。 ?>



通常の印刷結果は1です
コードは次のとおりです

コードをコピー $var1 = 1; $var2 = 2; 関数テスト(){ グローバル $var1,$var2; $var2 = &$var1; }
テスト(); $var2 をエコーし​​ます。 ?>







予期しない印刷結果は 2 です

印刷結果が 2 になるのはなぜですか?実際には、$var1 の参照が $var2 の参照アドレスを指しているためです。結果として、実際の値は変わりません

PHP の関数によって生成された変数は関数のプライベート変数であることは誰もが知っていますが、グローバルによって生成された変数はこの規則を回避できないのはなぜでしょうか。次のコードを見てください。

PHPコード

コードは次のとおりです

コードをコピー


関数テスト() {

グローバル $a;

unset($a); } テスト(); ?>
$a = 1; $a を印刷します;

充実効果は次のとおりです:
1

なぜ 1 が出力されるのですか? $aの設定が解除されていませんか?設定解除に失敗しましたか? PHPのバグ?
いいえ、実際には、unset は機能します。テスト関数の $a を unset します。関数の後に追加できます。 $a を印刷します;
つまり、globalはテスト関数の外側の$aと区別するために、テスト関数の外側の$aに対してエイリアス変数「$a」を生成します
次に、上記の例 1 に戻って、test_global のコード「$var2 =& $var1;」を見てください。つまり、$var2 は var1 が指す物理メモリ アドレスを指します
。 したがって、関数内の global と $GLOBALS[] の違いは次のとおりであるという結論を導き出します:
global は、関数の実際の外部変数ではなく、関数の外部変数を指すエイリアス変数を関数内に生成します。エイリアス変数が指すアドレスが変更されると、例 1 のような予期しない状況が発生します。 .
$GLOBALS[] は確かに外部変数と呼ばれ、関数内外で常に一貫性を保ちます。

次の 2 つの例を比較できます:

コードは次のとおりですコードをコピーグローバル:
関数 myfunction(){
グローバル $bar;
unset($bar);
}
$bar="何か";
myfunction();
エコー $bar;
?>
出力: 何か
$グローバル[]:
関数 foo()
{
unset($GLOBALS['bar']);
}
$bar = "何か";
foo();
エコー $bar;
?>
出力: 空
PHP のグローバル変数は C 言語とは少し異なります。C 言語では、ローカル変数でカバーされていない限り、グローバル変数は関数内で有効になります。これにより、誰かが不用意にグローバル変数を変更してしまう可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。

グローバルの適用例

コードは次のとおりですコードをコピー
$a = 1;

$b = 2;

関数Sum()

{
グローバル $a、$b;

$b = $a + $b;

}

合計();

エコー $b;
?>

上記のスクリプトの出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。

別の例を見てみましょう。

コードは次のとおりですコードをコピー
$var1 = 1; 関数テスト(){
unset($GLOBALS['var1']); }
テスト(); $var1 をエコーし​​ます。 ?>




$var1 が削除されているため、何も出力されません。

コードは次のとおりです

コードをコピー グローバル $var1; unset($var1); } テスト(); $var1 をエコーし​​ます。 ?>
$var1 = 1; 関数テスト(){



誤って印刷された 1.これは、エイリアス参照だけが削除され、値自体は何も変更されていないことを示しています。

グローバルな問題分析:
質問: config.inc.php でいくつかの変数 ($a) を定義し、他のファイルの関数の外側に ("config.inc.php") を含めました。これらの変数 $a がある場合は、関数内で使用する必要があります。宣言がない場合、echo $a は何も出力できません。そこで、global $a を宣言しますが、関数も変数もたくさんありますので、このように繰り返し宣言することはできませんよね。何か良い解決策があればアドバイスをお願いします。
回答1: まず、config.inc.php で定数を定義します: (定数名、定数値) を定義します
次に、使用する必要がある他の場所で「config.inc.php」を要求します。
その後、この定数をこのファイル内で直接使用できます。
回答 2: $x[a]、$x などの配列を定義して、グローバル $x を宣言するだけで済むようにする方法もあります。
回答 3: あなたの方法を試しましたが、うまくいきませんでした。
回答 4: php.ini ファイルを変更します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632142.html技術記事一部の友人は、これら 2 つは実際には書き方の違いであると言いました。ここで、global と $GLOBALS の違いを証明します。必要な場合は、具体的な参考として参照してください。 公式説明によると…
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート