依存関係注入:$グローバルの優れた代替品
依存関係噴射(DI)は、依存関係を明示的にするため、$ Globalsを使用するよりも優れていますが、$ Globalsはそれらを隠しています。 2。DIは、グローバルな状態を操作する必要がある$グローバルとは異なり、依存関係を簡単にock笑することにより、テスト能力を向上させます。 3. DIは、グローバルな範囲からコンポーネントを切り離すことにより緊密な結合を減らしますが、$ Globalsは予測不可能な副作用と名前空間汚染を作成します。 4。DIは、LaravelやSymfonyなどの最新のフレームワークで使用されるコンテナを介して、制御(IOC)の反転(IOC)をサポートし、スケーラブルで保守可能なアーキテクチャを可能にします。 5。$ GlobalsからDIへの移行は、機能をリファクタリングして依存関係をパラメーターとして受け入れ、新しいクラスでコンストラクターインジェクションを採用することにより、段階的に実行できます。 6.コンストラクター注入は、必要な依存関係がインスタンス時に提供されることを保証するため、好ましいDIパターンです。最終的に、DIはよりクリーンでよりモジュール式、およびプロフェッショナルコードにつながり、簡単なスクリプトを超えた深刻なPHPアプリケーションのベストプラクティスになります。
$ Globalsに依存する代わりに依存噴射を使用することは、最新のPHP開発において、より保守性が高く、テスト可能でスケーラブルなアプローチです。 $ Globalsはスコープ間の変数へのグローバルなアクセスを提供しますが、緊密な結合を導入し、コードをデバッグするのが難しくなり、予測可能性を損ないます。依存関係注射(DI)は、それらを必要とするコンポーネントへの依存関係を明示的に提供することにより、これらの問題を解決します。

なぜ$グローバルが不足するのか
$ Globalsは、グローバル範囲で定義されているすべての変数への参照を含むPHPのスーパーグローバルアレイです。便利ですが、それは貧弱な慣行を奨励します:
- 隠された依存関係:関数が$ Globalsからデータを取得する場合、署名を見るだけでそれが何に依存しているかは明らかではありません。
- テストが難しい:機能は外部のグローバル状態に依存しているため、単体テストで動作を簡単にockしたり隔離することはできません。
- 名前空間汚染:コードの任意の部分は、$ Globalsを変更でき、予期しない副作用やトレースが困難なバグにつながる可能性があります。
- タイトな結合:コンポーネントは、明確なインターフェイスを通じて必要なものを受信するのではなく、グローバル状態に依存するようになります。
例えば:

関数ProcessOrder(){ $ db = $ globals ['database']; $ db-> query( "..."); }
この関数には、データベースに依存していると宣言されていません。$ Globalsに存在するものを想定しています。それはそれを脆弱で不明確にします。
依存噴射がコードの品質を改善する方法
依存関係の注入とは、内部でそれらを取得するのではなく、外部からクラスまたは機能に依存関係(サービス、構成、またはオブジェクトなど)を渡すことを意味します。

1。明示的な依存関係
DIを使用すると、依存関係は関数またはコンストラクターの署名から明らかです。
class OrderProcessor { プライベート$データベース。 パブリック関数__construct($ database){ $ this-> database = $ database; } パブリック関数プロセス(){ $ this-> database-> query( "..."); } }
OrderProcessor
機能するためにデータベースが必要であることはすぐに明らかです。
2。より良いテスト
テスト中に模擬データベースを簡単に挿入できます。
$ mockdb = $ this-> createmock(database :: class); $ mockdb-> method( 'query') - > willreturn(true); $ processor = new OrderProcessor($ MOCKDB); $ result = $ processor-> process();
グローバルな状態を設定したり、副作用について心配する必要はありません。
3。緩い結合と再利用性
クラスは、グローバル変数や特定の実装に関連していません。内部ロジックを変更せずに、データベース、ロガー、または構成マネージャーを交換できます。
4。制御の反転(IOC)のサポート
DIは、オブジェクトの作成と依存関係の解像度を自動的に管理するIOCコンテナでうまく機能します。 Laravel、Symfony、Slimなどのフレームワークは、DIコンテナを広範囲に使用してアプリケーションアーキテクチャを合理化します。
単純なコンテナを使用した例:
$ container = new Container(); $ container-> set( 'database'、function(){ 新しいデータベース($ host、$ user、$ pass)を返します。 }); $ container-> set( 'orderprocessor'、function($ c){ new OrderProcessor($ c-> get( 'Database'))を返します。 });
これにより、オブジェクトの作成が集中化され、構成可能になります。
一般的なDIパターン
依存関係を注入する主な方法は3つあります。
- コンストラクターインジェクション:コンストラクターを介して依存関係を合格します(最も一般的で推奨)。
- セッターインジェクション:セッターメソッドを使用して、オプションまたは交換可能な依存関係を注入します。
- インターフェイスインジェクション:PHPではあまり一般的ではありません。依存関係がどのように注入されるかを定義するインターフェイスの実装を伴います。
コンストラクターインジェクションは、必要な依存関係が最初から存在することを保証するため、推奨されます。
$ GlobalsからDIへの移行
$ Globalsから離れることは、一度にすべてを発生させる必要はありません。小規模から始めてください:
- $ Globalsを使用する関数を特定します。
- 代わりにパラメーターを受け入れるようにリファクタリングします。
- 最初から新しいクラスで依存関係注射を使用します。
- 複雑なオブジェクトグラフを管理するためのDIコンテナを徐々に導入します。
たとえば、これを置き換えます。
function sendemail($ to、$ subject){ $ Mailer = $ Globals ['Mailer']; $ MAELER-> send($ to、$ subject); }
と:
function sendemail($ to、$ subject、maeler $ maeler){ $ MAELER-> send($ to、$ subject); }
または、さらに良いことに、コンストラクター注入のあるクラスでカプセル化します。
結論
依存関係噴射は、よりクリーンでモジュール式、テスト可能なコードを促進します。 $ Globalsはデータを共有する迅速な方法のように思えるかもしれませんが、技術的な負債と脆弱なアプリケーションにつながります。 DIはもう少し前払いの努力を必要としますが、長期的な保守性と柔軟性が報われます。
それは単なる傾向ではなく、専門的なPHP開発の基礎的な慣行です。 DIを一貫して使用し始めると、グローバル変数に戻ると、過去に足を踏み入れるように感じます。
基本的に、単純なスクリプトを超えて何かを構築している場合、Diは行く方法です。
以上が依存関係注入:$グローバルの優れた代替品の詳細内容です。詳細については、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;

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

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

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

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

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

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