Heim > Backend-Entwicklung > PHP-Tutorial > php中的数种依赖注入

php中的数种依赖注入

WBOY
Freigeben: 2016-06-23 13:24:57
Original
848 Leute haben es durchsucht

经常看到却一直不甚理解的概念,依赖注入(DI)以及控制器反转(Ioc),找了几篇好的文章,分享一下。 自己理解的,依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象。

举个现实生活中的例子来理解, 比如我要一把菜刀 如何获得
1.可以自己造一把,对应new一个。
2.可以找生产菜刀的工厂去买一把,对应工厂模式。
3.可以打电话 让店家送货上门,对应依赖注入。

再比如我是一个演员,我不可能要求某个导演,我要演某某剧的男一号,相反,导演可以决定让谁来演。而我们的object就是这个演员。

注入的几个途径:

1.construct注入

<?phpclass Book {   private $db_conn;    public function __construct($db_conn) {       $this->db_conn = $db_conn;   }}
Nach dem Login kopieren

但是如果依赖过多,那么在构造方法里必然传入多个参数,三个以上就会使代码变的难以阅读。

2.set注入

<?php  $book = new Book();  $book->setdb($db);  $book->setprice($price);  $book->set_author($author);?>
Nach dem Login kopieren

代码很清晰,但是当我们需要注入第四个依赖时,意味着又要增加一行。

比较好的解决办法是 建立一个class作为所有依赖关系的container,在这个class中可以存放、创建、获取、查找需要的依赖关系

<?phpclass Ioc {   protected $db_conn;   public static function make_book() {       $new_book = new Book();       $new_book->set_db(self::$db_conn);       //...       //...       //其他的依赖注入       return $new_book;   }}
Nach dem Login kopieren

此时,如果获取一个book实例,只需要执行$newone = Ioc::makebook();

以上是container的一个具体实例,最好还是不要把具体的某个依赖注入写成方法,采用registry注册,get获取比较好

<?phpclass 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);   }}
Nach dem Login kopieren

现在就可以通过如下方式来注册和注入一个依赖

<?php$book = Ioc::registry('book', function(){$book = new Book;$book->setdb('...');$book->setprice('...');return $book;}); //注入依赖$book = Ioc::resolve('book');?>
Nach dem Login kopieren

http://net.tutsplus.com/tutorials/php/dependency-injection-huh

http://scriptogr.am/mattsah/post/dependencies-in-php

http://martinfowler.com/articles/injection.html

http://www.potstuck.com/2009/01/08/php-dependency-injection/

http://www.potstuck.com/2010/09/09/php-dependency-a-php-dependency-injection-framework/

http://www.cnblogs.com/Seekr/archive/2012/06/20/2556463.html


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage