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

简介: ThinkPHP源码解析之控制器

接下来就会去执行hook的listen方法,监听标签的行为。

image.png



此时可以来到应用行为扩展定义文件,可以看到这个参数为模块初始化,但是因为这个值是空的。


所以在上图不会去执行,那么就把应用初始化的值给放到这个参数里边进行简单的测试。


这个类就是执行的钩子,对门面类的优化操作。


image.png


那么代码就会执行到$results[$key] = $this->execTag($name, $tag, $params);这里来。


参数说明


  • $name = string(22) “behavior\LoadBehavior”
  • $tag = module_init

接着通过正则对传过来的参数进行处理,最终返回moduleInit


然后通过$obj = Container::get($class);返回behavior\LoadBehavior的实例


最终通过is_callable这个函数进行验证,检测类里边的方法是否可以被调用,方法数组格式,这个方法后期咔咔单独写一篇文章作为对象来解析,这里只需要知道会返回false即可。


然后会把本类的$portal这个值赋值给$method,这个值就是run。


最后通过$result = $this->app->invoke($call, [$params]);这行代码,这行代码的底部执行就是通过反射机制实现的。


最后这段代码会返回NULL。


实例化控制器


接下来就是进行实例化控制器,调用的方法是$this->app->controller()


这里需要注意的是list这个函数,这个函数的后边会返回一个数组,然后list中的俩个变量会分别为索引0和1。


判断也会去执行第一个,同样会执行到容器类的make方法,这个方法会直接返回app\index\controller\Index这个类的实例。


image.png


二、关于ArrayAccess和直接执行魔术访问返回实例的区别

有一部分小伙伴都已经学会了ArrayAccess和魔术方法__get的使用了。


估计也有一部分在这俩个地方处于模糊地段,咔咔将这俩个放在一起在解析一次。


先聊ArrayAccess的使用


这个案例在之前也给大家演示过,主要就是实现ArrayAccess的这个类。


image.png


然后在来到控制器进行使用,先进行实例化,之前实现的案例如下。


但是这次需要实现的案例并不是下图所实现的。


image.png


接下来使用下图的方式进行访问,直接使用数组访问对象属性。


在上图中可以看到设置了一个属性title为kaka,在这个案例中直接用数组形式直接获取。


看到返回结果为kaka,也就是说直接使用数组形式访问对象的属性。

image.png

image.png





框架实战案例


在上一期文章中解析的路由中存在以下代码,接下来进行简单的解析一下。


image.png


先来看一下这个app的值打印出来就是think\App Object对象。



image.png

当think\App Object这个对象去访问request时,因为app属性就没有这个request,又因为app类是继承着container类,所以会去容器类执行下图方法。

然后就会去执行__get方法,执行make方法返回对应的实例。


image.png

然后就会去执行__get方法,执行make方法返回对应的实例。


image.png


此时你要是还有疑问就是,怎么就咔咔说会执行就会执行呢!


接下来咔咔带着大家做一个简单的测试就知道了。


在这个位置中随机打印一个数值。


image.png


然后来到容器类的ArrayAccess的offsetGet方法中打印一下传过来的值。


看一下打印结果,就很明确了。


image.png




关于ArrayAccess的使用就到这里就结束了,这也是在之前的基础上详细的进行了一次说明,接下来对容器中的__get方法进行详解,看在什么情况会执行__get方法。



相关文章
|
8天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
18 0
|
8天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
12 0
|
9天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
21 0
|
9天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
31 0
|
9天前
yolo-world 源码解析(二)(2)
yolo-world 源码解析(二)
21 0
|
23天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
51 1
|
27天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
43 0
|
9天前
Marker 源码解析(二)(3)
Marker 源码解析(二)
14 0
|
9天前
Marker 源码解析(一)(4)
Marker 源码解析(一)
13 0

推荐镜像

更多