Laravel 依赖注入思想

依赖注入

依赖注入是个花俏的名词,事实上是指:类的依赖经过构造器或在某些状况下经过「setter」方法「注入」。先看一段 Laravel 控制器里的代码实例:php

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Users\Repository as UserRepository;

class UserController extends Controller
{
    /**
     * 用户 Repository 的实例。
     */
    protected $users;

    /**
     * 建立一个新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * 显示指定 ID 的用户。
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        $user_info = $this->users->find($id);
        return view('user', ['user_info' => $user_info]);
    }
}

Laravel 经过服务容器来管理类依赖并进行依赖注入。若是使用一个接口做为函数参数的类型提示,这个时候就须要将指定的实现绑定到接口上面:html

interface EventPusher {
    public function send($data);
}
class RedisEventPusher implements EventPusher {
    public function send($data) {
        //
    }
}
$this->app->bind('App\Contracts\EventPusher', 'App\Services\RedisEventPusher');
use App\Contracts\EventPusher;

/**
 * 建立一个新的类实例。
 *
 * @param  EventPusher  $pusher
 * @return void
 */
public function __construct(EventPusher $pusher)
{
    $this->pusher = $pusher;
}

这个就是所谓的面向接口编程,接口能够理解为一个规范、一个约束。高层模块不直接依赖于低层模块,它们都应该依赖于抽象(指接口)。java

使用依赖注入,最重要的一点好处就是有效的分离了对象和它所须要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得很是灵活。laravel

控制反转

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则。其中**最多见的方式叫作依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。经过控制反转,对象在被建立的时候,由一个调控系统内全部对象的外界实体,将其所依赖的对象的引用传递给它。也能够说,依赖被注入到对象中。程序员

clipboard.png

<?php
/**
 * 没有IoC/DI的时候,常规的A类使用C类的示例
 */

/**
 * Class c
 */
class c
{
    public function say()
    {
        echo 'hello';
    }
}

/**
 * Class a
 */
class a
{
    private $c;
    public function __construct()
    {
        $this->c = new C(); // 实例化建立C类
    }

    public function sayC()
    {
        echo $this->c->say(); // 调用C类中的方法
    }
}

$a = new a();
$a->sayC();

当有了IoC/DI的容器后,A类再也不主动去建立C了,以下图所示:编程

而是被动等待,等待IoC/DI的容器获取一个C的实例,而后反向的注入到A类中,以下图所示:segmentfault

<?php
/**
 * 当有了IoC/DI的容器后,a类依赖c实例注入的示例
 */

/**
 * Class c
 */
class c
{
    public function say()
    {
        echo 'hello';
    }
}

/**
 * Class a
 */
class a
{
    private $c;
    public function setC(C $c)
    {
        $this->c = $c; // 实例化建立C类
    }

    public function sayC()
    {
        echo $this->c->say(); // 调用C类中的方法
    }
}

$c = new C();
$a = new a();
$a->setC($c);
$a->sayC();

参考连接

  1. 类型约束app

  2. PHP 依赖注入,今后再也不考虑加载顺序函数

  3. Java基础:面向对象三大特征、五大原则oop

  4. 依赖倒置原则

  5. PHP程序员如何理解依赖注入容器(dependency injection container)

  6. 聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)

  7. 深刻探討依賴注入

  8. 服务容器

相关文章
相关标签/搜索