PHPの$ Globalsを分かりましょう:グローバルな範囲に深く潜ります
$ Globalsは、グローバルスコープ変数への参照を含むPHPのハイパーグローバルアレイです。正解は次のとおりです。これは、動的変数処理またはレガシーコードのメンテナンスに適した参照により、グローバル変数を直接動作させますが、乱用しないでください。 1。$ Globalsはグローバル変数への直接的な参照を提供し、その値を変更すると、元の変数が変更されます。 2。グローバルキーワードとは異なり、$ Globalsは変数名への動的アクセスをサポートしますが、グローバルにはハードコーディングされた変数名が必要です。 3. Unset($ Globals ['var'])を使用すると、グローバル変数が実際に削除されます。 4.一般的な落とし穴には、テストとデバッグが困難なコードカップリングの作成が含まれます。 5.パラメーターを渡すか、$グローバルを使用して状態を管理することを避け、関数パラメーターを使用すると、依存関係注入または構成オブジェクトが推奨されます。 6.合理的な使用シナリオには、ブートスクリプト、動的な構成の読み込み、古いコードのメンテナンスが含まれます。要するに、$ Globalsは強力ですが、コードの保守性と明確性を確保するために注意して使用する必要があります。
PHPの$GLOBALS
SuperGlobalは、その仕組みを完全に理解することなく、または使用すべきかを完全に理解することなく使用される機能の1つです。グローバル範囲内のすべての変数への便利なアクセスを提供しますが、誤用は混乱を招くと非難の困難なコードにつながる可能性があります。 $GLOBALS
実際に何であるか、それがどのように動作するか、いつ使用するのか(またはそうでない場合)を明確で実用的な見てみましょう。

$GLOBALS
とは何ですか?
$GLOBALS
グローバル範囲で現在定義されているすべての変数への参照を含むPHPのスーパーグローバルアレイです。ここでのキーワードは参照です。つまり$GLOBALS['var']
にアクセスすると、価値を読んでいるだけではありません。元の変数自体で直接作業しています。
例えば:

$ color = 'blue'; 関数showcolor(){ echo $ globals ['color']; //出力:青 }
$color
関数のローカルスコープにはありませんが、 $GLOBALS
グローバルに定義されているため、アクセスできます。
$GLOBALS
ボンネットの下でどのように機能するか
通常の変数とは異なり、 $GLOBALS
値をコピーするだけでなく、グローバル変数への参照を保持します。これには重要な意味があります。

これを考えてみてください:
$ animal = 'cat'; 関数changeanimal(){ $ globals ['animal'] = 'dog'; } changeanimal(); エコー$動物; //出力:犬
この関数は$GLOBALS
を介してグローバル$animal
を変更し、その変化は関数の外側に持続します。これは、 global
キーワードの使用と同等です。
関数changeanimal(){ グローバル$動物; $ animal = 'dog'; }
しかし、ここにキャッチがあります。 $GLOBALS
参照を使用しているため、グローバルな範囲で変数を設定したとしても、 $GLOBALS
のエントリは、タイミングを理解するまでそれを反映する可能性があります。
例:
$ name = 'Alice'; 関数testunset(){ unset($ globals ['name']); } testunset(); echo $ name; //致命的なエラー:猛攻撃エラー:未定義の変数$ name
$GLOBALS['name']
を設定してください。グローバル変数は完全に削除されます。これは、参照であるためです。
主な違い: $GLOBALS
vs. global
どちらも関数内のグローバル変数にアクセスできますが、それらは異なって動作します。
-
global $var;
グローバル変数へのローカル参照を作成します。 -
$GLOBALS['var']
名前でグローバル変数に直接アクセスします。
比較の例:
$ count = 10; 関数incrementwithglobal(){ グローバル$ count; $ count; } 関数incrementwithglobals(){ $ globals ['count']; }
どちらの関数も同じことをします。ただし、 $GLOBALS
動的に使用できます。
function setglobal($ varname、$ value){ if(ISSET($ globals [$ varname])){ $ globals [$ varname] = $ value; } }
この種の動的アクセスは、ハードコーディングされた変数名を必要とするglobal
キーワードでは不可能です。
一般的な落とし穴とそれを避けるタイミング
その有用性ですが、 $GLOBALS
にはリスクがあります。
- タイトな結合:
$GLOBALS
に依存する機能は、グローバル状態に依存するようになり、テストと再利用が難しくなります。 - デバッグの難易度:変数が
$GLOBALS
を介して複数の場所から変更されると、追跡の変更が乱雑になります。 - セキュリティの懸念:構造が不十分なコードでは、
$GLOBALS
悪用することができます(例:Register_Globalsのようなシナリオでは、その機能は長い間削除されています)。
$GLOBALS
を使用しないでください:
- 関数間でデータを渡す(代わりにパラメーターを使用)。
- アプリケーション状態の維持(クラスまたは依存関係のインジェクションを使用)。
- 構成(構成配列または環境変数を使用します)。
実際のユースケース
$GLOBALS
理にかなっている正当なシナリオがあります:
- レガシーコードのメンテナンス:すでにグローバル状態を使用している古いコードベースを使用する場合。
- ブートストラップまたはセットアップスクリプト:グローバル構成を初期化するエントリポイントスクリプトで時々。
- 動的変数処理:実行時に決定された変数名で作業する必要がある場合。
例:構成をグローバルスコープに動的にロードする:
$ config = ['debug' => true、 'base_url' => 'https://example.com']; foreach($ config as $ key => $ value){ $ globals [$ key] = $ value; }
ここでも、単純な配列またはクラスがよりクリーンになるかどうかを検討してください。
まとめ
$GLOBALS
、すべてのグローバル変数への直接的な参照ベースのアクセスを提供する強力なツールです。特に動的変数名を扱ったり、レガシーシステムを維持したりする場合は、特定の場合に役立ちますが、データを渡すためのショートカットとして使用するべきではありません。
ベストプラクティス:
- グローバルアクセスよりも関数パラメーターと戻り値を好みます。
- アプリケーション設定には、依存関係注入または構成オブジェクトを使用します。
-
$GLOBALS
を使用する必要がある場合は、明確に文書化し、副作用を最小限に抑えてください。
$GLOBALS
理解することは、トラップを回避し、意図的に使用するのに役立ちます。偶然ではありません。そして、現代のPHPでは、それは通常、それを控えめに使用することを意味します。
基本的に、それは理由がありますが、すべてのパーティーに招待する必要はありません。
以上がPHPの$ Globalsを分かりましょう:グローバルな範囲に深く潜りますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

DependencyInjection(di)$ globalShidesthem.2.diimprovestestabilityの依存性による依存性の依存性の$ globalshidesthem.2.dieasyManipulatingglobalState.3.ductupeStightcouplingbydecoupなどの依存性を維持することで、依存性$ globals becaudeItmakesdependenciesexplicitの発行中心

$ globalSallowsunintendedvariablewritingのチェックされていない、aTmingStrationCriticalDatalidSoridSorolosErolosErowSOROUTS Validation;

$ GlobalsとGlobalはどちらも関数のグローバル変数にアクセスするために使用されますが、重要な違いがあります。1。$ Globalsは、$ Globals ['var']などのキー名を介して変数にアクセスするハイパーグローバルアレイです。 2. $ Globalsは事前宣言を必要とせず、直接使用することができます。グローバルは最初に宣言し、次に使用する必要があります。 3. $ Globalsは、$ Globals [$ varname]などの動的アクセスをサポートし、Globalは動的宣言をサポートしていません。 4.Unset($ Globals ['var'])はグローバル変数自体を削除しますが、Unset($ var)はグローバル$ vです

$ globalsmanipulationcancusuasusunpredicablebugsinphp; todebugandresolveit、1。$ globalsprovidesglobalacesstoallvariables、makestatechangeshardtotrack;

$ globalscreateShidDedendenciesを使用して、functionshardertotetest、壊れやすい、andunReusableを使用します

$ globalsMayBeAcceptableGACYSYSTEMSLIKEWORDPRESSPRUGINSWHEREITENSURESCOMPATIBILITYを使用する$を使用してください

$ Globalsを使用すると、単体テストが破壊され、隠された依存関係が導入され、テスト間の状態共有、混乱のある設定、分離が不十分で、シミュレートが困難になります。 2。ソリューションは次のとおりです。最初に保存してから、汚染を避けるためにグローバルな状態を復元します。 3. $ Globals Accessをサービスクラスにカプセル化し、依存関係の注入を通過して、テストでの模擬オブジェクトの使用を容易にします。 4.軽量の依存関係注入でさえ、テスト能力を大幅に改善する可能性があり、グローバル変数を直接読み取ることは避ける必要があります。 5.将来の問題を防ぐために、$ Globalsを無効にし、代わりに構成オブジェクト、依存関係噴射コンテナ、または環境変数を使用し、静的分析ツールを使用してハイパーグローバル変数の使用を検出します。最終的な答えは、$グローバルへの依存性をカプセル化と依存噴射を通じて徐々に排除する必要があります

ModernPhpframeworkslikelavalavelandsymfonyusedepentyinjectiontoEliminaterelianceon $ globalsbyinjectingdependenciesexplicty、改善可能性と測定のカップリング
