ホームページ バックエンド開発 PHPチュートリアル PHP 依存性注入 (DI) と制御反転 (IoC) に関する実践的なチュートリアルを共有します。

PHP 依存性注入 (DI) と制御反転 (IoC) に関する実践的なチュートリアルを共有します。

Jun 15, 2017 pm 02:07 PM
di ioc php 依存性注入 制御の反転

この記事では、PHP の依存性注入 (DI) と制御の反転 (IoC) に関する関連情報を主に紹介します。興味のある方は参考にしてください。

まず、依存性の注入と制御の反転について説明します。これも同じで、プログラム間の結合を減らすために使用されるデザイン パターンです。少し調べてみたところ、TP の公式 Web サイトに関連する記事がなかったので、これを紹介するためにこのささやかな記事を書きました。デザインパターンを見て、TP コミュニティに何か貢献できればと思っています。

まず第一に、このデザインパターンの定義を追求しないでください。そうしないと、著者はこれに深く影響を受けており、そのすべてが説明されています。理論的な観点から見ると、Java コードで記述されている語彙も馴染みのないものが多くあります。

何はともあれ、ようやく PHP の観点から依存性注入の概念を説明しましょう。

まず、ここにデータベース接続を使用する必要があるクラスがあると仮定します。最も原始的な方法によれば、このクラスは次のように記述できます。関数には、まずデータベース クラス ファイルを含めます。その後、新しい Db を通じて db クラスをインスタンス化し、データベース接続情報を渡します。その後、getList メソッドは $this->_db を通じてデータベース クラスを呼び出してデータベースを実装します。オペレーション。

目的の機能を達成できたようですが、これは悪夢の始まりです。example1、example2、example3... すべてが記述されると、ますます多くのクラスが db コンポーネントを使用する必要があります。このように、ある日、データベースのパスワードが変更されたり、db クラスが変更されたりした場合、すべてのクラス ファイルに戻って変更する必要があるのではないでしょうか。

この問題を解決するために、Factory メソッドを作成し、Factory::getDb() メソッドを通じて db コンポーネントのインスタンスを取得しました。

class example {
  
  private $_db;
  function __construct(){
    include "./Lib/Db.php";
    $this->_db = new Db("localhost","root","123456","test");
  }
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
 }
ログイン後にコピー

サンプル クラスは次のようになります。



rreee

これは完璧ですか?今後のすべてのクラス (example1、example2、example3...) についてもう一度考えてみましょう。実際には、コンストラクターの Factory::getDb(); を通じて Db インスタンスを取得する必要があります。この結合は、Factory クラスとの結合になります。ファクトリ クラスは、データベースの接続情報をパッケージ化するのに役立つだけですが、データベース情報が変更されたときは、Factory::getDb() メソッドを変更するだけで済みます。しかし、ある日突然、ファクトリ メソッドが変更されます。名前を変更する必要がある、または getDb メソッドの名前を変更する必要がある場合、どうすればよいでしょうか?もちろん、この種の要求は実際には非常に混乱していますが、場合によってはこのような状況が存在します。 1 つの解決策は次のとおりです。


外部からのインジェクションに依存します。ということですか?次の例を見てください:


class Factory {
  public static function getDb(){
    include "./Lib/Db.php";
    return new Db("localhost","root","123456","test");
  }
 }
ログイン後にコピー

このように、サンプル クラスは外部クラスから完全に分離されており、Db クラスにはファクトリ メソッドや Db クラスが存在しないことがわかります。外部からサンプル クラスの setDb メソッドを呼び出して、接続インスタンスを直接挿入します。このように、この例では、db 接続がどのように生成されるかを気にする必要がありません。
これは依存関係注入と呼ばれます。実装はコード内に依存関係を作成しませんが、それをパラメーターとして渡します。これにより、プログラムの保守が容易になり、プログラム コードの結合度が低減され、疎結合が実現されます。

これはまだ終わっていません。サンプル クラスで db に加えて他の外部クラスが使用されていると仮定しましょう。疲れていますか?
わかりました、毎回非常に多くの行のコードを記述する必要がないように、別のファクトリ メソッドを作成しました:


class example {
  
  private $_db;
  function __construct(){
    $this->_db = Factory::getDb();
  }
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
 }
ログイン後にコピー

例をインスタンス化すると、次のようになります:



class example {
  private $_db;
  function getList(){
    $this->_db->query("......");//这里具体sql语句就省略不写了
  }
  //从外部注入db连接
  function setDb($connection){
    $this->_db = $connection;
  }
 }
 //调用
$example = new example();
$example->setDb(Factory::getDb());//注入db连接
$example->getList();
ログイン後にコピー

It完璧に思えますが、上記のファクトリーメソッドを初めて使用したときの状態に戻ったように感じるのはなぜですか?これは確かに良い解決策ではないため、別の概念であるコンテナ (IoC コンテナや DI コンテナとも呼ばれます) が提案されています。


当初は setXXX メソッドを通じてさまざまなクラスを注入していました。コードは非常に長く、多くのメソッドが存在します。ただし、これはあまりクールではありません。setXXX メソッドは必要ありません。そのため、ファクトリ メソッドは必要ありません。 2. パッケージ化したら、依存関係の注入をどのように実装すればよいでしょうか?

ここで規約を紹介します。次のように、例のクラスのコンストラクターに Di $di という名前のパラメーターを渡します。



$example->setDb(Factory::getDb());//注入db连接
$example->setFile(Factory::getFile());//注入文件处理类
$example->setImage(Factory::getImage());//注入Image处理类
 ...
ログイン後にコピー

Di は、いわゆるコンテナーであり、さまざまなものを保存します。 Type インスタンスを使用する場合、$di->set() を通じて db という名前のインスタンスを設定します。これはコールバック関数を通じて渡されるため、db クラスは設定されたときにのみインスタンス化されます。 $di->get('db') が実行されるときも同様に、シングルトン モードを di クラスの設計に統合することもできます。


このように、グローバル スコープで Di クラスを宣言し、注入する必要があるすべてのクラスをコンテナーに配置し、そのコンテナーをコンストラクターのパラメーターとして example に渡すだけで済みます。サンプルクラスのコンテナからインスタンスを取得できます。もちろん、コンストラクターである必要はありません。setDi(Di $di) メソッドを使用して Di コンテナーに渡すこともできます。つまり、合意は自分で行うものなので、自分で理解する必要があります。 。

依存関係注入と主要なコンテナーの概念が導入されたので、残っているのはそれを実際に使用して理解することだけです。

以上がPHP 依存性注入 (DI) と制御反転 (IoC) に関する実践的なチュートリアルを共有します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles