理解并运用TP5.1-Facade

1.内容介绍

深刻解析tp5.1与laravel 中Facade底层原理实现php

 

1. 什么是Facadehtml

2. 为何须要有什么好处laravel

3.  Facade实现原理thinkphp

4. 功能实现、app

5. 容器注入框架

 

2.知识讲解

0.什么是Facade??为何须要?有什么好处

专业解释:工具

门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色以后,用户只须要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而下降了系统的耦合度。测试

 

通俗解释:spa

       门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你能够为任何的非静态类库定义一个facade类。3d

 

对于一个非静态的类,若是要调用这个类的方法咱们可能就是要经过new 建立这个对象,而后再经过 -> 调用这个类的方法

如:

 

咱们要调用这个类的方法就是

这样调用类,可是若是调用的次数多了,本身每次调用这方法都要建立类从写法上就以为不是很好而咱们更多的是想直接以静态经过类名::方法() 的方式调用,而且开发速度不快以及不够优雅,

 

而若是咱们使用facade模式

给这个类一个静态代理对象,而后咱们就能够经过静态的方式调用

 

 

固然如上是TP5手册的例子

 

1.本身实践一次

首先咱们能够建立一个工具类UserUtil

图片

若是说咱们须要使用这个类的时候,好比:在index控制器中进行调用UserUtil中的index方法

图片

如上代码,这就是咱们通常的操做方式。

这样咱们就会看起来不够的优雅。我在使用的时候还须要new出这个对象,我不想new怎么办?

 

咱们修改一下UserUtil中的index方法,用static修饰

图片

而后在控制器中,就能够经过类名的方式静态的调用了

图片

可是实际上这样并非很好,若是说咱们的UserUtil中会定义不少方法,若是说咱们的Util中不止一个UserUtil,好比有TreeUtil等等其余类,这个时候咱们就须要一一的给这些类定义static很明显就不够优雅,同时在内存中会一直保存这些静态属性,有不少使用其实次数很少可是也会保存很显然会占用一部分空间和资源。

 

其实还有一个最大的问题就是扩展和维护不强。

好比咱们在作项目的时候咱们在1.0版本的时候咱们可能会在index方法添加不少代码,同时又有不少其余的方法,但是有一天产品经理须要改需求,这个时候你发现你定义的这个类没用了不知足这个需求的时候那么咱们就只有需改源码

 

那么接下来咱们就须要对于这个UserUtil中的方法需改,但是当需改一个类的时间比一个新建一个类的时间要多的时候最好的办法就是重写。这个时候咱们可能在接下来的操做中要需改不少调用这个UserUtil的地方。肿么办??

 

咱们就可使用façade做为这种类代理。

 

首先:咱们先把UserUtil类中的index需改回来

图片

而后建立一个app\facade\UserUtil.php的门面代理类

图片

在类中继承Facade,同时重写think\Facade类中的getFacadeClass方法

在方法中return的值就是 这个类要代理的实际类 你也能够是

       return “app\util\UserUtil”;

只是那样能够显得高大上哈哈哈~~~

 

而后咱们在控制器中使用

注意!引入的是app\facade\UserUtil

图片

而后就成功了。

 

在代理类中除了重写getFacadeClass方法外还可使用think\Facade的bind方法

图片

 

首先咱们一块儿看一下tp5.1对于框架是怎么对于核心类库用facade代理的

打开thinkphp\base.php这个文件,就能够发现tp5.1的核心类库是经过Think\Facade中的bind方法进行了定义

同时又经过Think\Loader中的addClassAlias方法对于核心类别名注册

图片

那么咱们也能够模仿

 

 

首先把app\facade\UserUtil类进行处理

不重写getFacadeClass方法

图片

而后咱们在app\common.php中写

图片

而后使用

图片

Success

2.Tp5.1解析Facade

执行User::index()时

 

会进入think\Facade类中

由于没有实际调用的方法这个时候执行__callStatic

图片

经过createFacade建立实际被代理类的实例

图片

 

首先判断是否建立过

 

执行子类重写的定义被代理类的方法


图片

图片

若是没有重写定义这个被代理类的地址

这个时候就检查是否被绑定

重邦定的$bind中获取实例

图片

建立实例并执行实例的方法

 

图片

原文出处:https://www.cnblogs.com/wadhf/p/11908653.html

相关文章
相关标签/搜索