理解并运用TP5.1-Facade

摘要:
有什么好处专业解释:门面模式又称外观模式,用于为子系统中的一组接口提供一个一致的界面。我们就可以使用faade作为这种类代理。引入的是appfacadeUserUtil然后就成功了。

1.内容介绍

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

1. 什么是Facade

2. 为什么需要有什么好处

3.Facade实现原理

4. 功能实现、

5. 容器注入

2.知识讲解

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

专业解释:

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

通俗解释:

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

对于一个非静态的类,如果要调用这个类的方法我们可能就是要通过new创建这个对象,然后再通过-> 调用这个类的方法

如:

理解并运用TP5.1-Facade第1张

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

理解并运用TP5.1-Facade第2张

这样调用类,但是如果调用的次数多了,自己每次调用这方法都要创建类从写法上就觉得不是很好而我们更多的是想直接以静态通过类名::方法() 的方式调用,并且开发速度不快以及不够优雅,

而如果我们使用facade模式

给这个类一个静态代理对象,然后我们就可以通过静态的方式调用

理解并运用TP5.1-Facade第3张

当然如上是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需改回来

图片

然后创建一个appfacadeUserUtil.php的门面代理类

图片

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

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

return “apputilUserUtil”;

只是那样可以显得高大上哈哈哈~~~

然后我们在控制器中使用

注意!引入的是appfacadeUserUtil

图片

然后就成功了。

在代理类中除了重写getFacadeClass方法外还可以使用thinkFacade的bind方法

图片

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

打开thinkphpase.php这个文件,就可以发现tp5.1的核心类库是通过ThinkFacade中的bind方法进行了定义

同时又通过ThinkLoader中的addClassAlias方法对于核心类别名注册

图片

那么我们也可以模仿

首先把appfacadeUserUtil类进行处理

不重写getFacadeClass方法

图片

然后我们在appcommon.php中写

图片

然后使用

图片

Success

2.Tp5.1解析Facade

执行User::index()时

会进入thinkFacade类中

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

图片

通过createFacade创建实际被代理类的实例

图片

首先判断是否创建过

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

图片
图片
如果没有重写定义这个被代理类的地址

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

重邦定的$bind中获取实例

图片

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

图片

免责声明:文章转载自《理解并运用TP5.1-Facade》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用xentools快速创建虚拟机C# 操作地址 从内存中读取写入数据(初级)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Centos-修改文件访问和修改时间-touch

触摸如果文件存在,请更改文件的访问时间和修改时间。如果不存在,请创建一个空的文件相关选项。a将文件访问时间更改为当前系统时间。m将文件修改时间更改为当前系统时间。c如果文件不存在,请不要创建它。d不提示。d指定日期和时间。格式为Y-m-dH:m:S-r递归修改目录下的所有文件和内容...

winform中 跨线程启动UI

C#的winform程序中,是不可以从UI窗口主线程之外的线程去直接操作窗口控件的。确切的解释是,不能从创建控件的线程以外的线程去处理控件的操作,比如修改属性等。方法二,通过Control.Invoke调用委托的方式来执行。...

Json对象转Ts类

其次,Json是一种轻量级的数据交换格式。在前端和后端之间的数据交互过程中,后端接口返回Json格式的数据,前端需要使用相应的Ts类对象来接收它。此时,如果后端提供样本数据或现有接口返回的Json格式数据,是否有方法帮助我们从Json格式数据生成Ts类?介绍了三个主要功能。1.查看Json对应的Ts类,将要格式化的Json字符串复制粘贴到中间编辑区域。单击右...

mac下vscode插件位置

1、 位置:Mac:User/(您的用户名)/vscode/extensions II下vscode插件的存储位置。搜索步骤:以我的mac为例,打开查找器,单击远程CD,单击转到上面的文件夹,单击macintosh HD,单击用户(或用户),单击mymac,单击。vscode(.vscode是一个隐藏文件。如果默认情况下不显示,请按住ctrl+shift+....

愿你走出半生,归来仍是Java Parser

几天前,我的一个朋友给了我一个Haskell问题嘿,MK。假设我有一个BNF,我在Haskell中有一个这个BNF的解析器。现在,我想为这个BNF换一条线。是否有任何方法可以在不接触BNF解析器代码的情况下扩展BNF解析器?让我们想想,这个x是什么样的变体?请记住,传入的参数不是self,而是super。好了,openrecursion已经准备好了,剩下的是...

postman点击一次连续发送多次请求

可以测试同一个时间点创建订单。因为在工作中遇到的以此记录下,在工作上遇到同一个时间点产生了相同的赛时单号。...