容器和Facade 门面

ThinkPHP的IOC容器原理底层

1.1、IoC(控制反转 Inversion of Control)

简述:控制反转并不是一种技术,而是一种设计思想。通过控制反转容器(以后称容器),改变了原本某些对象运行时依赖其他对象资源时需要自己进行获取(比如通过new ClassName),所造成的对象之间的强耦合(耦合的概念如果不理解,可以先去了解一下。)。

所谓IoC,对于程序来说,就是构造了一个容器,比如在tp5中,这个容器叫Container,此容器来负责控制对象和对象间的关系。在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个),这样的话一个对象A和另一个对象B之间就有了很强的联系(也就是强耦合)。这种耦合体现在如果被依赖的资源类初始化的时候(也可能是其他时候)传入的参数变化了,你要修改两个类的代码,举例说明: 你本来用的是php本身的session机制,现在想改成也支持redis,并在初始化的时候增加一个参数来控制。这个时候你不止需要去修改类Session类的代码,还要去修改类A的代码。

1.2、DI(依赖注入 Dependency Injection Container)

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入,或者叫依赖注入容器)来实现的。比如还是上面的例子,对象A需要操作Session,以前我们总是要在A中自己编写代码来获得一个Session对象,有了 容器这个管家我们就只需要告诉容器,A中需要一个Session对象,至于这个Session对象怎么构造,何时构造,A不需要知道。在系统运行时,容器会在适当的时候制造一个Session,通过构造方法注射到A当中,这样就完成了对各个对象之间关系的控制,而且这种关系是松耦合的。 A需要依赖 Session才能正常运行,而这个Session是由容器注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? php有一个高级特性是反射(reflection),原理这里大概说一下,

反射可以在php运行中,提取出关于类、方法、属性、参数,注释等的详细信息,并可以动态的调用方法和类等。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。

反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,容器就是通过反射来实现注入的。

总结: 控制反转是说创建对象的控制权进行转移,由原来的资源需求方,转移到了容器,依赖注入是说本来是资源需求方依赖资源,现在资源需求方依赖于容器对资源的注入,可以看出来依赖注入和控制反转说的其实是一个事情。

顺便提一句,目前很多框架中都离不开反射功能。容器是一个典型的例子,容器在laravel和tp5中都是核心功能之一。

参考:https://zhuanlan.zhihu.com/p/268077043

Facade的原理

门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口 。用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。在tp5 facade 为容器中的类提供了一个静态调用接口

在tp5 为A类创建 门面 模式 需要 在原有的A 类的前提下!在创建一个门面B类 (名字随便)只要这个类库继承think\Facade 调用 getFacadeClass() 将 A基类 绑定到 门面模式中即可! 在其他类中即可 使用静态方法 调用 A类 !

demo: https://www.kancloud.cn/manual/thinkphp6_0/1037491

posted @ 2021-06-22 14:59  这该死的代码  阅读(80)  评论(0编辑  收藏  举报