php の依存関係の挿入と制御の反転という 2 つの概念を理解するには、次の問題を理解する必要があります。
di——依存性の注入
ioc——制御の反転
1. 参加者は誰ですか?
答え: 通常、3 つの関係者があり、1 つは特定のオブジェクト、1 つは ioc/di コンテナ、もう 1 つはオブジェクトの外部リソース。名詞についてもう一度説明しますと、オブジェクトとは通常の java オブジェクトを指します。ioc/di コンテナは単に ioc/di 機能を実装するために使用されるフレームワーク プログラムを指します。オブジェクトの外部リソースはオブジェクトを指します。オブジェクトの外部からのリソースは、オブジェクトが必要とする他のオブジェクトや、オブジェクトが必要とするファイル リソースなど、総称してリソースと呼ばれます。
2. 依存関係: 誰が誰に依存しているのか?なぜ依存関係があるのでしょうか?
答え:オブジェクトは ioc/di コンテナに依存します。依存関係は避けられないものであり、プロジェクトではさまざまなクラス間にさまざまな関係があり、すべてが完全に独立することは不可能であり、依存関係が形成されます。従来の開発では、他のクラスを使用するときに直接呼び出しますが、これは強い結合を形成するため、避けるべきです。依存関係の注入では、コンテナーを借用して依存オブジェクトを転送し、分離を実現します。
3. 注入: 誰が誰に注入するのか?いったい何が注入されるのでしょうか?
答え:必要な外部リソースをコンテナを通じてオブジェクトに注入します
4. 制御の逆転: 誰が誰を制御するのか?何を制御しますか?なぜ逆転と呼ばれるのでしょうか?
答え:ioc/di のコンテナ コントロール オブジェクトは、主にオブジェクト インスタンスの作成を制御します。反転は正の方向と相対的なものですが、何が正の方向とみなされるのでしょうか?通常の状況でのアプリケーションを考えてみましょう。a の中で c を使用したい場合、どうしますか?もちろん、c のオブジェクトは直接作成されます。つまり、必要な外部リソース c がクラス a で能動的に取得されます。この状況を順方向と呼びます。では、逆とは何でしょうか?つまり、クラス a は積極的に c を取得するのではなく、ioc/di コンテナが c のインスタンスを取得するのを受動的に待ち、それを逆にクラス a に注入します。
5. 依存関係の注入と制御の反転は同じ概念ですか?
答え:上記からわかるように、依存関係の注入はアプリケーションの観点から説明されており、依存関係の注入は次のことができます。ポイント: アプリケーションは、必要な外部リソースの作成と注入をコンテナに依存します。制御の反転は、コンテナの観点から説明されます。完全な説明: コンテナはアプリケーションを制御し、コンテナはアプリケーションを逆に注入します。アプリケーションには、アプリケーションの外部リソースが必要です。
例を通して、依存関係の注入の実装方法を詳しく見てみましょう。
1. コンストラクターの挿入
<?php class book { private $db_conn; public function __construct($db_conn) { $this->db_conn = $db_conn; } }
2. セッターの挿入
<?php class book{ private $db; private $file; function setdb($db){ $this->db=$db; } function setfile($file){ $this->file=$file; } } class file{} class db{} ... class test{ $book = new book(); $book->setdb(new db()); $book->setfile(new file()); } ?>
上記の 2 つのメソッドのコードは非常に明確ですが、多くの依存関係を挿入する必要がある場合、多くの行を追加することになり、管理がより困難になります。
より良い解決策は、すべての依存関係のコンテナとしてクラスを作成することです。このクラスでは、必要な依存関係を保存、作成、取得、検索できます。
<?php class ioc { protected $db_conn; public static function make_book() { $new_book = new book(); $new_book->set_db(self::$db_conn); //... //... //其他的依赖注入 return $new_book; } }
現時点で、ブック インスタンスを取得したい場合は、 $newone = ioc::makebook(); を実行するだけです。
上記はコンテナの具体例です。具体的な依存性注入メソッドは書かない方が良いです。レジストリ登録やget取得を利用した方が良いです。
<?php class ioc { /** * @var 注册的依赖数组 */ protected static $registry = array(); /** * 添加一个resolve到registry数组中 * @param string $name 依赖标识 * @param object $resolve 一个匿名函数用来创建实例 * @return void */ public static function register($name, closure $resolve) { static::$registry[$name] = $resolve; } /** * 返回一个实例 * @param string $name 依赖的标识 * @return mixed */ public static function resolve($name) { if ( static::registered($name) ) { $name = static::$registry[$name]; return $name(); } throw new exception('nothing registered with that name, fool.'); } /** * 查询某个依赖实例是否存在 * @param string $name id * @return bool */ public static function registered($name) { return array_key_exists($name, static::$registry); } }
次の方法で登録して注入できるようになります。
<?php $book = Ioc::registry('book', function(){ $book = new Book; $book->setdb('...'); $book->setprice('...'); return $book; }); //注入依赖 $book = Ioc::resolve('book'); ?>
以上は php の依存関係注入と制御の反転についての理解です。php プログラミングを学習する皆さんの参考になれば幸いです。