(3) IOC容器

07/11 15:49
阅读数 16

下面对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的超集。

未完待续

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部