1.内容介绍

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

1. 什么是Facade

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

3.  Facade实现原理

4. 功能实现、

5. 容器注入

2.知识讲解

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

专业解释:

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

通俗解释:

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

对于一个非静态的类,如果要调用这个类的方法我们可能就是要通过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中获取实例

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

理解并运用TP5.1-Facade的更多相关文章

  1. php 设计模式

    一.工厂模式 1.创建接口类,规范方法,要实现这个接口的类必须实现这个接口的所有方法,接口的方法默认是抽象的,所以不再方法前面加 abstract interface people{ public f ...

  2. 升级到php7相关问题,日请求过亿QQ会员活动平台PHP7升级实践

    升级到php7相关问题,日请求过亿QQ会员活动平台PHP7升级实践 日请求过亿:QQ会员活动平台PHP7升级实践http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4 ...

  3. 【读书笔记】Junit实战

    Junit实战读书笔记 第一章节 探索Junit: Junit是1997年Erich Gammay和Kent Beck一同创建的一个简单有效的测试框架,其中Erich Gammay是经典<设计模 ...

  4. Thinkphp5 主动式 计划任务 支持windows和linux

    百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这 ...

  5. laravel中facade serviceprovider的理解

    一个serviceprovider就是一个解决某个功能的公用模块,实际上可以直接用在di里注册然后从di中取出,为啥还要搞个facade呢? 有几个方面的原因 1.把实例化移入到serviceprov ...

  6. 关于TP5中的依赖注入和容器和facade

    看了不少的文章,也看了官方的介绍,还是根据自己的理解,写写看法,理清下思路 只是单纯的说依赖注入Dependency Injection和容器 别的不白扯 比如有A,B,C三个类 A类的1方法依赖B类 ...

  7. TP5.1:facade静态代理

    THINKPHP中有很多很多的facade静态代理,这些静态代理的位置在:thinkphp\think\facade文件夹下 1.在app\commom中新建一个文件,名为:Test.php,表示被代 ...

  8. tp5.1中的容器和facade的实现

    首先定义: 容器(Container)实现类的统一管理,确保对象实例的唯一性. 门面(Facade)为容器(Container)中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可 ...

  9. 设计模式理解(九)结构型——外观(Facade)

    等了好久,终于想起来开写了,这次写的是外观模式,记得大学时弄课程设计,外观模式搞得我比较混乱,因为单词不认识,后来觉得有点蛋疼,感觉是一坨混乱的东西然后加个壳再弄几个外部调用的接口而已.个人认为,Fa ...

随机推荐

  1. 在 C# 中使用变量

    目录 变量的声明 数据类型 变量的赋值 变量的使用 总结 程序离不开数据.把数字.字母和文字输入计算机,就是希望它利用这些数据完成某些任务.例如,需要计算双十一怎么买才最省钱或者显示购物车里面的商品列 ...

  2. 爬虫(五):代理IP、Cookie

    1. 代理IP 代理IP这个功能呢,在urllib和requests中都存在,但是这个在大的爬虫项目中是非常重要的,所以我拿出来单独讲解. 对于某些网站,如果同一个 IP 短时间内发送大量请求,则可能 ...

  3. Vue ES6箭头函数使用总结

    Vue ES6箭头函数使用总结   by:授客 QQ:1033553122   箭头函数 ES6允许使用“箭头”(=>)定义函数: 函数不带参数 定义方法:函数名称 = () => 函数体 ...

  4. 61-如何使用 Weave 网络?

    weave 是 Weaveworks 开发的容器网络解决方案.weave 创建的虚拟网络可以将部署在多个主机上的容器连接起来.对容器来说,weave 就像一个巨大的以太网交换机,所有容器都被接入这个交 ...

  5. 微信 电脑版 HOOK(WeChat PC Hook)- 定位dll获取数据和调用功能的地址

    方案一:CE搜索内存数据,OD断点查看堆栈方案二:使用旧版本的特征码,在新版本搜索方案三:借鉴WeTool的dll,用ida分析获取地址方案四:ida静态分析微信,看字符串和输出日志 源码: http ...

  6. 大数据理论篇 - 通俗易懂,揭秘谷歌《The Dataflow Model》的核心思想(一)

    目录 前言 目标 核心的设计原则 通用的数据处理流程 切合实际的解决方案 总结 延伸阅读 最后 作者:justmine 头条号:大数据达摩院 创作不易,未经授权,禁止转载,否则保留追究法律责任的权利. ...

  7. canves做的时钟目前已经开源

    canves做的时钟目前已经开源 git地址: https://github.com/jidanji/canves-clock/tree/1.0.1 项目截图 时流过的时间变得有颜色,其他的没有颜色.

  8. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  9. 精通awk系列(15):awk数据类型和字面量

    回到: Linux系列文章 Shell系列文章 Awk系列文章 数据类型 gawk有两种基本的数据类型:数值和字符串.在gawk 4.2.0版本中,还支持第三种基本的数据类型:正则表达式类型. 数据是 ...

  10. Android TeaScreenPopupWindow多类型筛选弹框

    多类型筛选弹框.多数据筛选.多样化diy.单选or多选.必藏 (Multiple Type Screening Boxes, Multiple Data Screening, Diversified ...