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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: ThinkPHP容器源码深度解析

执行流程图


既然把代码都理清楚了,这时来理一下执行的流程图可以看的更清晰。


image.png


invokeClass方法详细解析


不管是阅读完上边的代码流程,还是上图的流程图,肯定都知道了最终代码会走向一个方法invokeClass,就是这个方法。


这个方法中全部都是利用反射的知识点,不会的在去看上文或者之前的文章吧!


在invokeClass方法中,最重要的就是绑定参数的这个方法bindParams,这个方法里边也全部运用的是反射。


所以在容器中反射起到的作用有多大就不用在去做过多的说明了。


在这之前需要把这块说明一下,看到这个__make方法,咔咔是记忆尤深哈!


这个方法在之前学习config源码配置那一篇文章中咔咔说暂时略过,因为当时所储备的知识点和框架代码执行流程还没到说明__make这个方法的阶段。


为了就是在容器这里详细的说明__make这个方法的作用。


image.png


当你打印reflect这个变量的值时会返回俩个反射类的对象,如下图。


image.png


代码$reflect->hasMethod('__make')就是判断此反射类里边是否存在__make函数


代码$method = new ReflectionMethod($class, '__make');就是执行反射类的一个方法 这里就指的是__make方法


当断点这个method就会返回俩个存在__make反射类,这里是因为断点了只有显示了俩个反射类。


这里主要谈论think\Config.


image.png


最后一行代码$method->isPublic() && $method->isStatic()就是判断方法是不是公公共的 判断方法是不是静态的


直到运行到$args = $this->bindParams($method, $vars);这行才会进入到bindParams方法,这个方法也会在下文给出详细的解析。


解析bindParams方法


接下来就解析一下bindParams这个方法。


关于参数传递的就是一个反射类 第二个参数暂时不做说明,目前还没有遇到响应的场景。


第一个参数值$reflect


image.png

image.png



使用反射方法$reflect->getNumberOfParameters()获取反射类中对应的方法中的参数数目。按照上文的就是__make方法。容器代码中只获取过俩个方法的参数数目,一个是__make方法,一个是就是反射类中的构造函数。


由于目前还没有传递vars变量的场景,所以这块的内容暂时不去研究它直接略过。


代码$params = $reflect->getParameters();也是使用反射获取方法的参数。


打印出来可以看到的结果是俩组数据。


image.png


那么这这组数据是从哪里来的呢!往上翻一下,看一下$reflect这个参数是什么就明白了。


think\App这个反射类是没有__make方法的,所以会获取构造函数中的参数。


image.png


然后think\Log反射类中存在__make方法,于是就会返回__make的参数,如下图。


image.png


就像类似于think\Log这样的类,既有__make方法,也存在构造函数,就会走俩次bindParams方法,这个应该都明白,正是下图逻辑。


image.png


在接下来就是循环反射类中获取的参数。


获取参数名、和获取对应的反射类


最后将获取出来的反射类传递给getObjectParam方法。


image.png


在这个getObjectParam方法中并没有多少内容。


由于$vars从头到尾都是空数组所以去除数组第一个的操作和判断是否为闭包都不会执行。


最终会在返回去执行make方法


image.png


然后make方法会直接从容器中返回这个实例


image.png


当一个反射类存在__make方法时,最终就会执行return $method->invokeArgs(null, $args);,带参数执行反射类方法


image.png

使用容器来调用配置类


既然已经把容器源码读了一次了,可不可以使用容器来实现呢!


那当然是可以的了,这里需要注意一下咔咔的命名空间,这里由于为了以后回顾方便把类名也起成了Container了,所以给加了一个别名,你们在使用的时候是不需要的哈!


image.png


截止到这里容器的源码就讲解的差不多了,后边咔咔会做一个完整的流程图,提供改大家查看。



相关文章
|
12天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
13天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
87 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
68 0
|
3月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
73 0
|
3月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
96 0
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12

推荐镜像

更多