接下来就会去执行hook的listen方法,监听标签的行为。
此时可以来到应用行为扩展定义文件,可以看到这个参数为模块初始化,但是因为这个值是空的。
所以在上图不会去执行,那么就把应用初始化的值给放到这个参数里边进行简单的测试。
这个类就是执行的钩子,对门面类的优化操作。
那么代码就会执行到$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这个类的实例。
二、关于ArrayAccess和直接执行魔术访问返回实例的区别
有一部分小伙伴都已经学会了ArrayAccess和魔术方法__get的使用了。
估计也有一部分在这俩个地方处于模糊地段,咔咔将这俩个放在一起在解析一次。
先聊ArrayAccess的使用
这个案例在之前也给大家演示过,主要就是实现ArrayAccess的这个类。
然后在来到控制器进行使用,先进行实例化,之前实现的案例如下。
但是这次需要实现的案例并不是下图所实现的。
接下来使用下图的方式进行访问,直接使用数组访问对象属性。
在上图中可以看到设置了一个属性title为kaka,在这个案例中直接用数组形式直接获取。
看到返回结果为kaka,也就是说直接使用数组形式访问对象的属性。
框架实战案例
在上一期文章中解析的路由中存在以下代码,接下来进行简单的解析一下。
先来看一下这个app的值打印出来就是think\App Object对象。
当think\App Object这个对象去访问request时,因为app属性就没有这个request,又因为app类是继承着container类,所以会去容器类执行下图方法。
然后就会去执行__get方法,执行make方法返回对应的实例。
然后就会去执行__get方法,执行make方法返回对应的实例。
此时你要是还有疑问就是,怎么就咔咔说会执行就会执行呢!
接下来咔咔带着大家做一个简单的测试就知道了。
在这个位置中随机打印一个数值。
然后来到容器类的ArrayAccess的offsetGet方法中打印一下传过来的值。
看一下打印结果,就很明确了。
关于ArrayAccess的使用就到这里就结束了,这也是在之前的基础上详细的进行了一次说明,接下来对容器中的__get方法进行详解,看在什么情况会执行__get方法。