标签 控制反转 下的文章

2016
02-18

依赖注入和控制反转是什么?

年前,@绵阳飞在群里发起了一个讨论,依赖注入和控制反转到底是什么?
我之前对依赖注入和控制反转也不甚理解,直至在学习Phalcon框架的过程中,发现在Phalcon文档中有一个篇幅通过代码示例的方式专门描述了依赖注入的原理。本文打算通过此文档中的代码示例来讲解什么是依赖注入(DI)和控制反转(IoC)。通过示例代码,来更加深入的了解这些概念。

接下来的例子有些长,但解释了为什么我们要使用依赖注入。所以绝对都是干货,请耐心读完,必会有所收获。

依赖的产生

首先,假设我们正在开发一个组件,叫SomeComponent,它需要执行的内容现在还不重要。 但是我们的组件需要依赖数据库连接。

<?php

class SomeComponent
{
    /**
     * 数据库连接是被写死在组件的内部
     * 因此,我们很难从外部替换或者改变它的行为
     */
    public function someDbTask()
    {
        $connection = new Connection(
            array(
                "host"     => "localhost",
                "username" => "root",
                "password" => "secret",
                "dbname"   => "invo"
            )
        );

        // ...
    }
}

$some = new SomeComponent();
$some->someDbTask();

从上面这个例子中,可以看到数据库连接是在组件内部建立的。在我们日常开发中,类似这样的依赖关系在项目中非常常见。但是这种方法其实是不太实用的;我们不能改变创建数据库连接的参数或者选择不同的数据库系统,因为数据库连接是在组件被创建时建立的。

查看全文 >
微信扫一扫