ThinkPHP容器源码深度解析(1)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: ThinkPHP容器源码深度解析

ThinkPHP容器源码深度解析


前言

在这之前已经剖析过了类的自动加载、配置文件加载的源码解析,本文为第三期的文章,主要针对容器以及门面类的实现,解析源码。以及学习实现此功能的一些知识点。


第一期文章:ThinkPHP自动加载Loader源码分析

第二期文章:ThinkPHP配置文件源码分析

一、单例模式

在学习容器以及门面之前需要必须了解的俩个设计模式,单例模式、注册树模式。


先对单例模式做一个简单的说明。


  • 拥有一个构造函数,并且属性为private
  • 拥有一个静态成员变量来保存类的实例
  • 拥有一个静态方法来访问这个实例

一下就是咔咔实现的一个简单的单例模式,对照一下上面的三大特性看是否一致。


静态变量为instance


拥有构造并且还是私有的


最后一个就是有一个getInstance这个静态方法


image.png


接下来进行一下简单的测试


还是在index控制器中做测试,为了证实其类只被实例化过一次,调用了其四次


image.png


访问这个方法来看一下


new-class只执行了一次,就直接证明了创建的类只实例化了一次。


image.png


在这里咔咔之前有过一个疑问就是,这里的构造函数为什么要使用私有的属性。


你之前有过这个疑问吗?咔咔带你一起来解答一下


在本类定义私有属性的构造方法是为了防止其类在外部被实例化。


当在外部实例化这个类就会报下图的错。


image.png


那么为什么会在这里提一嘴单例模式呢!是因为在接下来的学习容器的源码中会使用到


例如下图thinkphp/library/think/Container.php类中就存在一个获取当前容器的实例。



截止到这里单例模式就简单的了解完了,了解单例模式也是为了更好的理解容器。


二、注册树模式

为什么在这里说这个注册树模式,因为在框架中注册树模式就是一个主导位置,所以必须去了解它!


那什么是注册树模呢!


注册树模式就是将对象实例注册到一颗树上(这里的树可不是真的树啊!就是注册到一个全局的属性里边)

然后可以通过内部方法从全局的树上获取对应的对象实例。

这样说的话肯定也不能更好的理解,接下来咔咔带大家看一个简单的案例来简单的了解一下。


一个注册树模式需要的东西就是四个,注册树的池子,将对象挂载到注册池里,从注册池里获取对象,从注册池里卸载对象。


如下图是咔咔写的一个简单的注册树模式。


代码如果看不懂的就需要去补补基础了哈!


image.png

image.png


接下来在到同一目录创建一个TestTree文件


image.png


来到控制器测试写的注册树模式是否有问题


在做测试的时候一定要注意命名空间问题哈!这里的kaka目录是之前在类的自动加载哪里配置的,如有不会的可以去第一期文章查看。


这里就相当于先把TestTree这个类实例化出来


然后使用注册树模式把这个实例注册到object树池子中


最后使用get方式将这个类获取出来就可以直接调用TestTree中的方法了。


image.png


最后看一下最终打印结果,结果就是TestTree类中getTreeContent方法的返回值。


image.png


注册树模式就是以上咔咔说明的这些内容,就是不去针对源码学习,这些内容也是我们必须要去学会使用的。



相关文章
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
5天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
17天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
38 3
|
25天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
30天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
53 1
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
60 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
80 0

推荐镜像

更多