この記事では、PHP の依存性注入 (DI) と制御の反転 (IoC) に関する関連情報を主に紹介します。興味のある方は参考にしてください。
まず、依存性の注入と制御の反転について説明します。これも同じで、プログラム間の結合を減らすために使用されるデザイン パターンです。少し調べてみたところ、TP の公式 Web サイトに関連する記事がなかったので、これを紹介するためにこのささやかな記事を書きました。デザインパターンを見て、TP コミュニティに何か貢献できればと思っています。
まず第一に、このデザインパターンの定義を追求しないでください。そうしないと、著者はこれに深く影響を受けており、そのすべてが説明されています。理論的な観点から見ると、Java コードで記述されている語彙も馴染みのないものが多くあります。
何はともあれ、ようやく PHP の観点から依存性注入の概念を説明しましょう。
まず、ここにデータベース接続を使用する必要があるクラスがあると仮定します。最も原始的な方法によれば、このクラスを次のように記述できます。関数には、まずデータベース クラス ファイルを含めます。その後、新しい Db を通じて db クラスをインスタンス化し、データベース接続情報を渡します。その後、getList メソッドは $this->_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
外部からのインジェクションに依存します。ということですか?次の例を見てください:
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();
当初は setXXX メソッドを通じてさまざまなクラスを注入していました。コードは非常に長く、多くのメソッドが存在します。ただし、これはあまりクールではありません。setXXX メソッドは必要ありません。そのため、ファクトリ メソッドは必要ありません。 2. パッケージ化したら、依存関係の注入をどのように実装すればよいでしょうか?
$example->setDb(Factory::getDb());//注入db连接 $example->setFile(Factory::getFile());//注入文件处理类 $example->setImage(Factory::getImage());//注入Image处理类 ...
このように、グローバル スコープで Di クラスを宣言し、注入する必要があるすべてのクラスをコンテナーに配置し、そのコンテナーをコンストラクターのパラメーターとして example に渡すだけで済みます。サンプルクラスのコンテナからインスタンスを取得できます。もちろん、コンストラクターである必要はありません。setDi(Di $di) メソッドを使用して Di コンテナーに渡すこともできます。つまり、合意は自分で行うものなので、自分で理解する必要があります。 。
依存性注入と主要なコンテナーの概念が導入されたので、残っているのはそれを実際に使用して理解することだけです。
以上がPHP の依存関係の挿入と制御の反転の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。