IOC容器
Posted huachengai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了 IOC容器相关的知识,希望对你有一定的参考价值。
下面对thinkphp6与laravel7的容器做一个比较。
首先理解下三个概念:
IOC(控制反转)、DI(依赖注入)、IOC容器
IOC:简单来讲,就是对类的新建、管理交由他人去处理。省去了new Class的步骤。
DI:IOC的实现方式,逐层搜索类的依赖,并实例化。是一种递归的思想。
IOC容器:存储DI处理过后的实例化对象。
用生活的例子去描述:制作一张桌子。
如果我需要张桌子去写作业,在没有机器加持情况下,只能自己动手去制作。
首先我需要木材,找到木材后,我需要钉子,找到钉子后,我总得有锤子吧。使用这些材料与工具,我制作一张漂亮的桌子,但是耗时又费力。
现在来了个新邻居,他是专业的木匠。我现在只需要任务交给他,他帮我实现所有的制作流程,刚好他家又大又宽,能把制作的东西暂存。
我需要的时候才拿出来用,不需要就放那搁着,要是我想要个新桌子,就叫他帮忙重新做个。
类似于委托,隐藏了后面的复杂实现,减少了我的工作量。
以上就是容器的整个思想。
下面看一下thinkphp6&laravel7是如何去实现这种思想的。
再来理解下psr11,这个是fig组织设定的容器接口规范,目前的大部分框架有比较好的支持。
它约定了两个方法,一个get($id) -- 从容器中获取实例化的对象,一个has($id) -- 检查是否存在于容器。另外约定了出错,抛出的exception的种类。
不同的框架去实现了这个接口。但大家同读九年义务教育,却养育了不同性格的人,虽然大家都学习了相同的知识,但实际是两个不相干的人。
thinkphp6与laravel7的容器本质是一样,但设计有些不一样。
两个框架的核心是:将需要实现的类首先绑定到容器,绑定不意味着就帮你实例化了(类似登记,不干活),当你取的时候再帮你实例(赖人),容器还比较精明(给了你两个选择,1、客官留一份存根,下次无需等待,一键领取;2、要是下次还帮你新作个,要花点时间等等,但每次都是新鲜出炉),最后还给个完美的售后(告诉某个你想告诉的人,我拿了)。
核心三个方法:bind、make、call。不同框架名字不一定一样。
论述完基本的原理,我们深入看下thinkphp6&laravel7的模样和代码实现。
尽量少贴代码,要不得讲很久。
先讲一下两者的功能的区别:
thinkphp6优势:无。
laravel7优势:上下文绑定(特别适合参数的类型是接口,但绑定到不同的实现类),可变数量的参数绑定(一次绑定多个类),扩展绑定(适合于实例化后,再次装饰)
下面主要分析laravel7的代码。thinkphp6的代码比较直观,可读性比较强,就一个Container类,laravel有好多个类。给我的感觉是,laravel是thinkphp的超集。
未完待续
以上是关于 IOC容器的主要内容,如果未能解决你的问题,请参考以下文章