目次
なぜ$グローバルが不足するのか
依存噴射がコードの品質を改善する方法
1。明示的な依存関係
2。より良いテスト
3。緩い結合と再利用性
4。制御の反転(IOC)のサポート
一般的なDIパターン
$ GlobalsからDIへの移行
結論
ホームページ バックエンド開発 PHPチュートリアル 依存関係注入:$グローバルの優れた代替品

依存関係注入:$グローバルの優れた代替品

Aug 03, 2025 pm 03:56 PM
PHP $GLOBALS

依存関係噴射(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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

依存関係注入:$グローバルの優れた代替品 依存関係注入:$グローバルの優れた代替品 Aug 03, 2025 pm 03:56 PM

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

$ Globalsを介した未確認のグローバル状態のセキュリティリスク $ Globalsを介した未確認のグローバル状態のセキュリティリスク Aug 03, 2025 pm 04:20 PM

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

$ Globalsの操作によって引き起こされるグローバルな状態のカオスのデバッグ $ Globalsの操作によって引き起こされるグローバルな状態のカオスのデバッグ Aug 03, 2025 pm 01:46 PM

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

$ Globals vs. `Global`キーワード:コアの違いを理解します $ Globals vs. `Global`キーワード:コアの違いを理解します Aug 04, 2025 pm 03:59 PM

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

グローバル国家の危険:PHPの$グローバルを避けるべき理由 グローバル国家の危険:PHPの$グローバルを避けるべき理由 Aug 03, 2025 am 04:14 AM

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

地雷原のナビゲーション:$グローバルの合法的な(およびまれな)ユースケース 地雷原のナビゲーション:$グローバルの合法的な(およびまれな)ユースケース Aug 04, 2025 pm 02:10 PM

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

$ Globalsで覆われたユニットテストコードの悪夢 $ Globalsで覆われたユニットテストコードの悪夢 Aug 05, 2025 am 09:06 AM

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

最新のPHPフレームワークが$ Globalsを廃止する理由 最新のPHPフレームワークが$ Globalsを廃止する理由 Aug 05, 2025 am 07:39 AM

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

See all articles