$ Globals:歴史的な遺物または誤解されたツール?
$ Globalsは本質的に悪くありません。それはその価値がその使用に依存するツールです。これは、すべてのグローバル変数へのアクセスを提供する連想配列であり、グローバルキーワードなしで機能変数を読み取るための関数を可能にします。その否定的な評判は、グローバルな状態を奨励し、依存関係を隠し、緊密な結合を促進し、変化を追跡するのを難しくすることに起因します。ただし、$ Globalsは、特定のシナリオで依然として役立ちます。1。リファクタリングが非現実的であるレガシーコードメンテナンス。 2。基本的な構成に$ Globalsを使用した単純なスクリプト。 3. WordPressなどの高度なデバッグまたはフックシステム。 4.ランタイムパッチングや一時的なオーバーライドによるテストなどのまれなケース。使用する場合、ベストプラクティスには、使用法の文書化、不必要な変更の回避、新しいアプリケーションのコアロジックに依存せず、その使用をブートストラップまたは構成レイヤーに分離することが含まれます。最新のPHPでは、依存関係の注入と明示的なパラメーターの合格が、より良いテスト可能性と保守性のために推奨されます。したがって、$ Globalsは機能的であり、ニッチアプリケーションを持っていますが、一般に、より予測可能なパターンを支持して回避する必要があります。
$ Globalsは、PHPのSuperGlobalsの1つです。これは、スクリプト全体のすべてのスコープで利用可能なグローバル変数です。長年にわたり、それは避けるべきものとしての評判を育ててきました。しばしば「歴史的な遺物」またはコーディングの貧弱な慣行の兆候とラベル付けされています。しかし、それは本当に時代遅れですか、それとも単に誤解されていますか?

短い答え: $ Globalsは本質的に悪くはありません。それはツールであり、あらゆるツールと同様に、その価値はその使用方法に依存します。
$ Globalsが何であるか、なぜそれが悪いラップを得るのか、そしてそれがまだ有用かもしれないときに分解しましょう。

$ globalsとは何ですか?
$GLOBALS
PHPスクリプトのグローバル範囲で定義されたすべての変数への参照を含む連想配列です。例えば:
$ foo = 'hello'; 関数example(){ echo $ globals ['foo']; //出力:こんにちは }
$_GET
や$_POST
などの他のスーパーグロバルとは異なり、 $GLOBALS
、 global
キーワードを使用する必要なく、関数内からユーザー定義のグローバル変数に直接アクセスできます。

この動作はそれを強力にしますが、悪用された場合も危険です。
なぜ$ Globalsが悪い評判を得ているのか
いくつかの理由がそのネガティブなイメージに貢献しています:
- グローバルな状態を奨励する:
$GLOBALS
に依存すると、グローバル変数に依存するコードにつながる可能性があり、テスト、デバッグ、およびメンテナンスがより困難になります。 - 依存関係を不明瞭にする:関数が
$GLOBALS['something']
にアクセスする場合、それがどの外部状態に依存しているかはすぐにはわかりません。 - タイトな結合を促進する:グローバルスコープから変数を引き出すコードは、その範囲にしっかりと結合され、再利用性を低下させます。
- 変更を追跡するのが難しい:コードのどの部分もグローバル変数を変更できるため、バグのダウンを追跡することはより困難になります。
これらの問題は現実的で深刻です。特に、予測可能性と保守性が重要な大規模なアプリケーションまたはチーム環境では。
しかし、 $GLOBALS
自体を非難することは、悪いカットのためにナイフを非難するようなものです。問題はツールではなく、それがどのように振る舞うかです。
$ Globalsがまだ役立つ場合
現代のPHP開発は、依存関係の注入、サービスコンテナ、および明示的なパラメーターの合格を支持しますが、 $GLOBALS
実用的である可能性のあるニッチのケースがあります。
1。レガシーコードのメンテナンス
古いPHPアプリケーション(特に事前のプリプまたは手続きシステム)では、 $GLOBALS
すでに使用されていることがよくあります。すべてを一度にリファクトすることは実行不可能な場合があります。そのような場合、 $GLOBALS
を理解し、安全に作業することが必要です。
2。簡単なスクリプトの構成または定数
シンプルさが重要な小さなユーティリティスクリプトまたは共有ホスティング環境では、一部の開発者は$GLOBALS
を使用して構成を管理します。
$ globals ['config'] = [ 'db_host' => 'localhost'、 'debug' => true ];
定数または構成ファイルの方が優れていますが、このパターンは小さなプロジェクトでは壊滅的ではありません。
3。高度なデバッグまたはフックシステム
一部のフレームワークまたはデバッグツールは$GLOBALS
を使用して、検査のためにデータを注入するか、フックメカニズムを実装しています。たとえば、WordPress(物議を醸すものの)はグローバルな状態を広範囲に使用し、プラグインがそれと対話することがあります。
4。ランタイムパッチングまたはテスト(まれ)
非常に具体的なテストシナリオでは、ユニットテスト中のモンキーパッチのグローバル変数など、 $GLOBALS
使用して、一時的に値を上書きすることができます。ただし、これは慎重に、そしてクリーンアップで行う必要があります。
ベストプラクティス(使用する必要がある場合)
$GLOBALS
使用する必要がある場合は、次のガイドラインに従ってください。
- ドキュメントの使用法は明確に:グローバル変数がアクセスされている理由を明らかにします。
- グローバルを不必要に変更しないでください。可能な場合は、読み取り専用として扱います。
- 新しいアプリケーションでコアロジックフローに$ Globalsを使用しないでください:依存関係注射を好みます。
- 使用済みの使用法:ビジネスロジックの深いものではなく、ブートストラップまたは構成レイヤーにグローバルアクセスを維持します。
結論
$GLOBALS
、壊れたり廃止されたりするという意味では「遺物」ではありません。依然として機能しており、狭いにもかかわらず有効なユースケースを持っています。しかし、現代のPHP開発では、一般的に、より予測可能でテスト可能なパターンを支持してそれを避ける方が良いです。
それを遺物と呼ぶと、物事を単純化しすぎます。それは低レベルの機能であり、乱用が容易であり、よく構築されたアプリケーションで正当化するのが難しいと言う方が正確です。
いいえ、 $GLOBALS
悪ではありません。しかし、あなたが明確で正当な理由を持っていない限り、あなたはおそらくそれなしでより良いでしょう。
基本的に:それを知って、理解し、それを使用しないことを選択します。
以上が$ 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の発行中心

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

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

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

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

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

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

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