PHPにおけるglobalと$GLOBALの違いの分析
global と $GLOBALS[] は書き方が違うだけだと思っている人がほとんどですが、実際はそうではありません。両者の違いを見てみましょう。
公式の説明によると、
$GLOBALS['var'] は外部グローバル変数 $var そのものです。
global $var は、external $var と同じ名前の参照またはポインタです。 (エラー: これはエイリアス参照であり、ポインタではありません!!!)
例を示します:
php $GAOBAL[] の使用法:
01 <?php 02 $var1 = 1; 03 $var2 = 2; 04 function test() { 05 $GLOBALS['var2'] = &$GLOBALS['var1']; 06 } 07 08 test(); 09 echo $var2; 10 ?>
通常の出力結果は 1 です
php グローバルの使用: test() 関数の
01 <?php 02 $var1 = 1; 03 $var2 = 2; 04 05 function test(){ 06 global $var1, $var2; 07 $var2 = &$var1; 08 echo $var2; 09 $var2 = 'qianyunlai.com'; 10 } 11 12 test(); // 输出 1 13 echo $var2; // 输出 2 14 echo $var1; // 输出 qianyunlai.com 15 ?>
$var1 と $va2 はどちらもローカル変数です。これらは、global キーワードを追加して、グローバル変数 $ を参照するだけです。それぞれ var1、$va2。$var2 = &$var1; の場合、ローカル変数 $var2 はグローバル変数 $val2 をポイントしなくなり、グローバル変数 $var1 にリダイレクトされます。つまり、ローカル変数の変更$var2 は変更されません。その後、グローバル変数 $val2 に影響し、リダイレクトされたグローバル変数 $val1 に影響します。
別の例を見てみましょう。
1 <?php 2 $var1 = 1; 3 function test(){ 4 unset($GLOBALS['var1']); 5 } 6 test(); 7 echo $var1; 8 ?>
$var1 が削除されたため、何も出力されませんでした。
01 <?php 02 $var1 = 1; 03 04 function test(){ 05 global $var1; 06 unset($var1); 07 } 08 09 test(); 10 echo $var1; 11 ?>
誤って印刷してしまいました 1.
これは、エイリアスのみが削除され、$GLOBALS['var'] の参照がまったく変更されていないことを証明します。 ######理解する?
つまり、グローバル $var は実際には $var = &$GLOBALS['var'] になります。これは外部変数を呼び出すための単なるエイリアスです。
PHP の global と $GLOBALS は書き方が異なるだけでなく、この 2 つの違いは依然として非常に大きいため、実際のアプリケーションでは注意する必要があります。
最初に次の例を見てください:
1 <?php 2 $id = 1; 3 function test() { 4 global $id; 5 unset($id); 6 } 7 test(); 8 echo($id); // 输出 1 9 ?>
参照の位置付け
多くの PHP 構文構造は参照メカニズムを通じて実装されているため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。 。参照渡しや参照渡しなどの一部の構造については、すでに上で説明しました。参照を使用するその他の構造は次のとおりです。
グローバル $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、次のことと同じです。
01 <?php 02 $GLOBALS["var1"] = 1; 03 $var = &$GLOBALS["var1"]; 04 unset($var); 05 echo $GLOBALS['var1']; //输出1 06 //############################################ 07 $GLOBALS["var1"] = 1; 08 $var = &$GLOBALS["var1"]; 09 unset($GLOBALS['var1']); 10 echo $var; //输出1 11 //############################################ 12 //如果写成如下,则会出错 13 $GLOBALS["var"] = 1; 14 $var = &$GLOBALS["var"]; 15 unset($GLOBALS['var']); 16 echo $var; //脚本没法执行 17 //########################################### 18 ?>
これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。
unset は、変数名と変数の内容の間のバインドを解除するだけです。これは、変数の内容が破壊されることを意味するものではありません。
isset($var) を使用する場合は false を返します。 $this オブジェクトのメソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。
これは、$GLOBALS 配列を使用することで回避できます。
関数内でグローバル変数を参照する例:
01 <?php 02 $var1 = "Example variable"; 03 $var2 = ""; 04 05 function global_references($use_globals) { 06 global $var1, $var2; 07 if (!$use_globals) { 08 $var2 = &$var1; // visible only inside the function 09 } else { 10 $GLOBALS["var2"] = &$var1; // visible also in global context 11 } 12 } 13 14 global_references(false); 15 echo "var2 is set to '$var2'\n"; // var2 is set to '' 16 global_references(true); 17 echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable' 18 ?>
global $var; を $var = &$GLOBALS['var']; の省略形として扱います。したがって、別の参照を $var に割り当てる場合は、ローカル変数への参照のみが変更されます。
前に述べたように、参照はポインタではありません。これは、次の構成では期待される効果が得られないことを意味します:
1 <?php 2 $bar = 3; 3 function foo(&$var) { 4 $GLOBALS["baz"] = 5; 5 $var = &$GLOBALS["baz"]; 6 } 7 foo($bar); 8 echo $bar;//输出3 9 ?>
これにより、関数の呼び出し時に foo 関数の $var 変数が $bar にバインドされますが、その後 $ に再バインドされます。上のバー $GLOBALS["baz"]。
関数 foo には変数 $bar がないため ($var として表されますが、$var にはシンボル テーブル内の名前と値のバインディングを呼び出さずに、変数の内容を変更します)。参照リターンを使用して、関数によって選択された変数を参照できます。
PHP マニュアルの $GLOBALS の説明を引用します:
グローバル変数: $GLOBALS、注: $GLOBALS は PHP 3.0.0 以降のバージョンに適用されます。
定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。
PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているため、global キーワードによって生成される変数はこの規則から逃れることはできません。global は、外部を指す関数内にエイリアスを生成します。関数の変数です。関数の外部にある実際の変数ではなく、変数です。エイリアス変数のポインティング アドレスが変更されると、予期しない状況が発生します。$GLOBALS[] は確かに外部変数と呼ばれ、常に一貫性を保ちます。機能の内と外。
01 <?php 02 $a = 1; 03 $b = 2; 04 function Sum() { 05 global $a, $b; 06 $b = $a + $b; 07 } 08 Sum(); 09 echo $b; 10 ?>
出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。
なぜ 2 ではないのでしょうか? 関数の外では影響がありませんか? $b は関数内で参照によって変更されていませんが、変更された $b は物理メモリの値を指していることに注意してください。したがって、外部入力は 3 になります。
関連する推奨事項:
PHP Global 変数と $GLOBALS 変数のスコープと相違点以上がPHPにおけるglobalと$GLOBALの違いの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
