本文主要描述了门面的使用和实现过程,并且对源码进行剖析。 使用框架的伙伴应该都知道在5.1时框架新增了一个特性那就是本文将编写的门面,也就是facade这个特性。 使用过这个特性的都明白其中的好处,那就是方法调用可以直接静态进行调用,不用再使用关键字static来定义。 接下来咔咔将会从以下几个方面带着大家探索属于门面的故事。 在之前有写过配置文件加载一文,在那一文中的最后提到过配置信息获取的几种方式。 其中有一种方式就是Config::get(),到这篇文章应该都知道使用Config获取配置信息时,必须先得引入 虽说我们使用的是 然后会执行同文件的 虽说现在还没有看源码,看着知道就好了,在调用 在学习容器时我们都知道容器是使用了注册树模式,需要使用对应对象实例的时候就可以直接获取,这样就避免了一个类反复的创建。这就是其中的一个优点。利用容器的特性 对于以前使用config来说,需要使用config的命名空间,然后进行实例化才能进行调用。 如果此时config不让使用了,需要使用自己创建的config类,如果没有使用门面模式,就需要修改大量的代码,而且是全局的。 但是如果使用了框架中的facade门面模式之后,你就只需要重写 首先创建一个控制器Facade,并且写上以下内容。 这里只是简单的使用门面的方式来获取配置文件信息。 别名的设置是在 在app目录下新建一个文件夹facade,用来专门存放门面类。 这里创建了一个Sessions的类。 这就是没有使用门面时的处理方式,需要引入对应的类,然后进行实例化,在用实例化的类进行方法调用。 先在kaka目录下建立俩个目录,分别为facade和util 也就是说我们只需要实现一份然后在其它项目中用的时候直接拿过去就可以了。 所以就可以直接把文件复制到util目录下,记得修改命名空间即可。 会发现结果跟之前是一致的,但是很明显的一个区别就是使用了facade模式后,可以直接使用静态方式进行调用。 还记得在之前说过门面的一个好处吗? 假设这个Sessions工具类在未来的一天停止使用了,那么我们只需要修改 在上文中我们从实例化类到使用门面方式实现了同一个功能。 虽说想要实现的效果显示出来了,但是代码还是不够简洁优美的,结构也比较混乱。 接下来咔咔会给大家提供一个可行的方案,如果你有其它的方案可以提出来哈!评论区见。 在正常开发工作中自定义的门面类不可能只有一个或者几个,在复杂的项目中门面类会有很多。 既然多,那就需要进行管理。 并将代理类和实际类对应起来,然后设置别名。 那么钩子文件应该什么时候执行呢!那就是在应用初始化的时候进行加载。 在TP5.1中应用初始化的配置是在 在应用初始化的配置项里把钩子文件配置进去即可。 最后一步就是测试了,依然是执行 根据测试结果可以得知我们的方案代码编写没有问题。 接下来我们使用别名来测试一下。 在解析源码之前先认识俩个方法。 我们就从获取配置文件开始解析 在这个文件中就是之前说的,如果存在 如果不存在的话就需要使用bind方法来进行门面绑定。 这里如果不明白就需要去文档好好看看门面那一章节哈! 这个方法就是文章开头就直接说明的,访问不存在的静态的方法时则会调用此方法。 在这个方法里边有一行代码是这个样子的 因为在子类中也有同样的方法,在本类中也有同样的方法但是在本类中的方法是没有任何返回值的。 这时你有没有一丝丝的困惑,这里使用的static到底会执行哪里的方法。或者这样想,为什么会执行子类的方法。 保留这些疑问将会在下文给你细细的讲来,先来把门面类的源码看完。 在这个方法中主要看我圈起来的几个地方。 第一处就是从子类的 第二处是当子类没有 第三处就是之前文章提到的容器了,这里就不对这里做详细说明了,如果不会的点开主页去看之前的文章。 在这里不得不说明一下static这个关键字。 新学习的伙伴估计只能知道static是用来定义静态变量和静态方法的。 当然这里不会去给大家说怎么定义静态方法和静态变量,而是说一个非常非常小的细节点。 先看一个实例,这个实例也是在阅读门面源码时,咔咔根据门面源码改编过来的。 咔咔这里新建了俩个文件,分别为test和test1。 test继承test1文件,并且都有同样的方法getKaka。 test的源码 test1源码 修改test1的代码,把static改为self 此时就是文档开始起作用了,但是当你打开PHP文档会发现,在static这一篇中并没有对这类情况作出说明。 经过咔咔多次测试和查阅资料,最终总结结果如下。 static::$test 如果有被继承的话 默认调用子类 ,否则调用的是自身 self::$test 如果有被继承的话,默认调用本类 放在本实例中来说明就是,当test继承test1时。 在test1中使用static调用方法 在test1中使用self调用方法 这个小小的细节也是咔咔无意中发现的,如果有什么不对的地方可以提出来,咔咔作出修改。 因为在继承这方面还有另外一种情况,咔咔私下会进行测试,在这里就不说明了。 这里对这个static做出解释主要是为了解释 因为这行代码调用的方法在子类和父类都存在,所以咔咔为了不让大家出现迷惑就写出来做一个简单的介绍。 先来一份门面流程图,可以更清晰的看到门面类的具体执行流程。 这里主要是对阅读完门面类后,做一个小总结。 门面类主要是结合了容器来实现的一个功能,因为需要容器来返回对应的实例,关于容器的文章也已经完成了,如果对容器有不会的可以在文章的开头去看对应的文章即可。 本文中给大家介绍了门面在容器中如何使用,并且给大家提供了最优的使用方式,这里的最优是咔咔个人见解,因为这种方式咔咔使用了接近俩年了。 无论从代码的健壮性还是扩展性都是非常实用的。 再就是关于static关键字,给大家做的一点点冷门知识得补充,当一个类继承一个类时,在父类实用static关键字时,默认调用的子类的方法。 这里的总结只是针对于本文的实例。 其实在这里咔咔还想给大家说明一个点就是 因为在以前的用法的哥参数就直接是方法,但是在这里碰到了数组形式,那么这个数组中的俩个值都代表的是什么呢! 第一个值为实例,第二个值为实例中的方法。 关于 到这里关于门面的源码解析就结束了,最重要的还是理解容器,因为门面就是在容器的基础上实现的,这也就是咔咔先写容器在写门面的原因。 还有就是关于门面的使用咔咔也给出了方案,如你有更好的方案可以在评论区给一个大概的思路。 坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。
“
前言
一、简单认识一下在框架中的门面的好处
use think\facade\Config,又因为在系统中注册了别名,所以直接使用use Config即可。use think\facade\Config,但是实际调用的方法却是thinkphp/library/think/Facade.php中的__callStatic方法。createFacade方法。createFacade方法时是直接从容器类里边获取的。getFacadeClass这个方法即可,只需要改变里边的返回结果诶自己定义的即可,因为对于其它文件调用的地方它们不关心实例调用的是什么,只关心方法名和返回结果。
二、学习框架中facade的使用
在这里可以看到使用的是use Config,这个就是config类的别名。base.php中设置的。
在框架中如何正确的使用facade呢!
先做一个测试,检测代码是否写的有问题。在控制器的facade文件中进行测试。
打印结果,结果就是我们预期的结果。
那么这份代码怎么改为门面模式呢!跟着咔咔的脚步一步一步的来。
为什么要建立这俩个文件夹呢!util大家应该都知道那就是工具类,这种类文件是可以在其它项目中公用的。
然后在到facade目录下新建一个Sessions的类,并且继承Facade。然后写上一下内容。
此时我们在来到控制器进行测试一下。getFacadeClass方法里边的内容即可。

三、优化在框架中facade的使用
首先建立一个属于门面的配置类。
此时需要建立一个钩子文件,将门面类注册和门面类别名注册都放在里边进行执行。
还有最后一步,那就是钩子文件虽然创建了但是没有执行。application/tags.php这个文件中。
测试application/index/controller/Facade.php文件中的getUserInfo方法。
这里有没有发现一个问题,就是既然在钩子中定义了门面类的别名了,但是在这里并没有使用。

四、门面类源码解析
__callStatic:当访问不存在的静态方法时,会调用此方法。call_user_func_array:可以直接用此函数来直接调用函数。
执行Config::get('facade.');会执行到文件thinkphp/library/think/facade/Config.php中。getFacadeClass方法就会直接返回对应的别名。
在上边类中是不存在get方法的,所以就会直接调用thinkphp/library/think/Facade.php文件中的__callStatic方法。
接着就会执行本类中的createFacade这个方法$facadeClass = static::getFacadeClass();这段代码会在下文做详细的说明。getFacadeClass方法获取类的别名。getFacadeClass方法时,从手动绑定的属性中获取。
五、static关键字
控制器进行调用
打印结果
这个时候有没有一点点疑惑,这里怎么打印出来的是147,而不是456呢!
打印结果
使用self的代码相信大家都看的明白,那为什么使用static就出现了有可能不太明白的结果呢!getKaka时,默认调用的是test类中的getKaka,也就是子类的方法。getKaka时,默认调用的是test1类中的getKaka,也就是本类的方法。thinkphp/library/think/Facade.php文件中这个行代码。
六、总结
门面类的源码很是简单,除了几个不太常见的知识点,代码相信都看的明白。return call_user_func_array([static::createFacade(), $method], $params);call_user_func_array这个方法的使用咔咔就不去做案例给大家看了,只需要知道它会去执行传入得方法即可。
“
0
0
相关文章
thinkphp如何配置伪静态隐藏index.php
thinkphp数据库迁移和数据填充怎么用
thinkphp查询作用域(scope)如何简化查询
thinkphp session无法保存或跨控制器失效怎么办
thinkphp如何防止SQL注入和XSS攻击
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。
3
2026.03.03
本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。
12
2026.03.03
Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。
69
2026.02.28
Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。
59
2026.02.28
Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。
46
2026.02.28
本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。
24
2026.02.27
本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。
20
2026.02.27
本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。
4
2026.02.27
热门下载
相关下载
精品课程
共12课时 | 0.7万人学习
共18课时 | 1.3万人学习
共11课时 | 0.7万人学习






