ホームページ  >  記事  >  バックエンド開発  >  PHP の依存関係の注入と control_php スキルの反転について理解する

PHP の依存関係の注入と control_php スキルの反転について理解する

WBOY
WBOYオリジナル
2016-05-16 08:59:463180ブラウズ

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 プログラミングを学習する皆さんの参考になれば幸いです。

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