ThinkPHP源码解析之控制器(3)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: ThinkPHP源码解析之控制器

__get方法使用详解


这个案例请看下图中的这个$this->hook。


image.png


同样的道理先来调试一下这个$this是什么值。


打印这个值都没什么必要,因为就是在本类中。


image.png


在类中属性的访问应该都会,就是直接使用$this-> 即可。


所以说当系统访问$this->hook这个的时候,由于App类是不存在hook这个属性的,所以就会去执行容器类的魔术方法。


image.png


然后在去执行make方法,创建类的实例。


image.png


三、执行控制器中的方法

本文的请求地址为配置的域名。


image.png


通过上文可以知道$instance的值就是app\index\controller\Index的实例。


这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。


在这里$this->app['middleware']->controller这段代码的使用,还能记得是使用的ArrayAccess还是直接为__get吗?


这里是在使用访问数组的形式访问对象,所以使用的是ArrayAccess的形式,这俩种概念一定要区分清楚。


image.png


接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index即可。


在这里需要注意的就是这行代码$this->rule->getConfig('action_suffix'),这里获取的是操作方法后缀。


image.png


假如现在给这个操作方法后缀设置一个值会变成什么样子呢!


给添加一个kaka的值,进行访问一下看会是什么结果。


image.png


这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。


image.png


对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {,在这里可以看见我们的老朋友is_callable。


对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为app\index\controller\Index的实例,第二个参数为index执行操作方法。


那么is_callable的作用就是检测在app\index\controller\Index类中的index方法名是否可以执行。


很明显这里会返回一个true,因为在index类里边存在index方法的。


这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。


通过这个is_callable判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。


第一种情况:类里边存在可执行的方法


  • 首先返回一个 ReflectionMethod 类
  • 获取方法名 index
  • 未设置方法名后缀返回空
  • 设置当前的操作名
  • 在这个案例中没有设置参数,所以最终的$vars就是一个空数组。

为了测试带有参数的这一段代码,我们需要对路由地址进行一点改动。


image.png


在之前没有使用路由,而是直接使用的默认地址,接下来将使用这个路由地址


image.png


使用这个路由地址进行一下数据的打印,可以看到就是我们设置的路由参数。


image.png


这段获取请求变量的方法会进入到$this->request->param();这行代码


框架是如何获取参数的


访问地址:http://www.source.com/index.php/hello/hello


在上文知道是通过$this->request->param()来获取参数的,那么在框架是如何获取参数的呢!


根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。


所以代码会执行到$this->param,当前请求参数和URL地址中的参数合并这里,在这里注意咔咔圈出来的地方。


由于咔咔是使用路由方式进行的请求所以,在这里框架专门为路由封装了一个获取请求参数。


image.png


来到这个route方法,看到注释就明白是用来获取路由参数的,但是还是需要在进入一层到input。


image.png


在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。


image.png


所以说$this->route就是存放的这条路由规则所有的参数,包含路由参数。


image.png


这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route穿进来的参数是false,所以说这块会直接返回。


image.png


这里返回的结果会返回给上文我们开始解析的地方,也就是说这个$vars就是获取到的路由参数。


image.png


第二种情况:类里边不存在可执行的方法


当第一种判断执行is_callable判断类里边的方法不可执行时,就会执行到第二种情况。


image.png


先来请求的一个没有设置的路由地址,看会返回什么。


image.png


根据代码给的提示,我们来到index控制器建立一个_empty方法,然后在来请求一次,看一下会发生什么。


image.png


根据打印结果就可以看出来当访问的方法不存在时就会去执行_empty这个方法。


image.png


那么这个方法是怎么执行的呢!这种执行方式就是利用反射机制来实现的,关于反射咔咔之前专门出了一篇文章来讲解的,但是大家还是需要对着文档进行阅读查看。


第三种情况:类里边不存在可执行的方法也不存在_empty方法


这种情况就比较简单了,就是直接返回错误信息,关于这里异常处理咔咔也会在后文说到。


image.png


三种情况执行完


三种情况分析完了,最后都会去执行统计的方法。


调用反射执行类的方法 支持参数绑定,也就说这里的闭包执行流程到这里就执行完了。


关于后边的自动请求,在第五节中详细说明。


image.png



相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
3天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
16天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
36 3
|
1月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
53 5
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
107 5
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
59 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
80 0
|
1月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)

推荐镜像

更多