# IOC控制反转和容器: * * * * * 由于笔者之前是从事java方面的后因各种原因转行了php。 如果用过spring的话,那么在thinkphp5.1之中的设计模式和思想你都应该会有所接触。 * * * * * 解释:IOC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等。所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。 以下代码是我对spring的理解而写出来的,虽然在thinkphp5.1上可能会有细微的不同,但是大致上差不多。 简单的来说下面有那么一段代码 ``` class{ function user() { //实例化一个用户模型 $userModel =new UserModel(); $userModel ->xxxx(); } } use xxx/xxxx/UserModel; class{ //此处由容器自动实例化,然后使用依赖注入一个用户模型 function user(UserModel $userModel) { $userModel ->xxxx(); } } ``` # 容器做有什么好处呢? 答案:解耦合低内聚,集中管理资源。 上面这样说虽然不用你手动去new一个对象出来,但是谁去做这一件事情呢,答案是容器。 如果我们需要构造一个很多个参数的的对象,每次需要传入一堆参数再去new一下是不是有点麻烦呢? 就像工厂模式这样,你对工厂说,我要一个用户,他就自动装配和生成一个用户给你,你不用去了解其生产细节只需要你会去使用就好。 如果你大量代码都需要new去实例化,这样既可以节省代码量,也可以更轻松的修改和维护。 # 实例 ## 代码 ![](https://box.kancloud.cn/d495b4eac6e6cb561cd8c93666f9e68f_1878x1002.png) ``` <?php namespace app\index\controller; class Ioc { //手动实例化 function index() { $test = new Test(); return $test->echoTest(); } //使用依赖注入,注入之前自动实例化,默认调用无参的方法 function index2(Test $test) { return $test->echoTest(); } //使用容器自动生成new一个出来Test类的实例化出来 function index3() { $test = app('app\index\controller\Test'); return $test->echoTest(); } } ``` 我们可以看到当前是index模块下的Ioc控制器下面有3个方法 1. index方法 我们可以看到我需要调用另外一个类,这个类是什么都行,这边只是我继承了控制器而已,与继承什么无关。然后我手动去实例化这个Test类,获得其对象然后再用他的方法,最后返回输出。 2. index2方法 使用依赖注入,注入之前自动实例化。下面引用官方的一些话: 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。 3. index3方法 使用助手app(),该方法会使用单例模式实例化。并且放到容器里面再去返回该实例